OneNet平台可视化界面实战:基于MQTT协议的温度湿度监控与设备控制

📅 发布时间:2026/7/6 9:15:35 👁️ 浏览次数:
OneNet平台可视化界面实战:基于MQTT协议的温度湿度监控与设备控制
1. 从零开始为什么选择OneNet与MQTT如果你手头有一块像野火指南者这样的开发板上面接了温湿度传感器和LED灯想随时随地看看家里的温湿度或者远程把灯打开你会怎么做自己搭个服务器写个APP听起来就头大。我刚开始玩物联网的时候也这么想过直到我遇到了OneNet平台和MQTT协议才发现这件事可以如此简单。今天我就带你手把手用最“小白”的方式在OneNet上打造一个专属的温湿度监控与设备控制面板。简单来说OneNet是中国移动旗下的物联网云平台你可以把它理解为一个免费的、现成的“物联网数据中转站和展示中心”。你的硬件设备下位机把数据发给它它帮你存起来还能通过网页上位机漂亮地展示出来甚至让你通过网页反向给设备发指令。而MQTT协议就是这个过程中设备与云端“对话”的语言它是一种特别为物联网设计的轻量级通信协议就像给设备发短信省电、高效、在网络不稳定的情况下也很可靠。这个实战项目的最终效果就是在一个网页上你能看到实时更新的温度仪表盘、湿度变化折线图还有一个可以点击的开关点一下远在另一个房间的开发板上的LED灯就亮了再点一下就灭了。整个过程你几乎不需要写复杂的后端代码只需要在OneNet平台上进行“可视化”配置。下面我就把我在这个项目中踩过的坑、试出来的最稳路径毫无保留地分享给你。2. 战前准备硬件接线与软件环境搭建工欲善其事必先利其器。在登录OneNet点点点之前我们得先把硬件和基础的软件环境准备好。别担心这部分我会讲得非常细。2.1 硬件清单与连接我用的硬件是野火指南者开发板STM32F103VET6这是非常经典的一款学习板。你还需要DHT11温湿度传感器用来采集温度和湿度数据。一个LED灯开发板上一般自带我们用它来作为被控制的对象。接线方式核心DHT11一共三个针脚。VCC接开发板的3.3VGND接GND数据线DATA我接在了PC9引脚上。这个引脚号很重要后续写单片机程序时会用到。LED我们直接用开发板上现成的LED比如连接在PB5引脚上的那个。这样就不用额外接线了。硬件连接就是这么简单。关键在于你要记清楚DHT11的数据线和LED控制线具体接在了哪个GPIO引脚上写代码时就对着这个来。2.2 下位机程序思路与关键代码下位机程序是在Keil MDK里用C语言写的。它的核心任务有两个第一定时读取DHT11的数据第二通过串口按照MQTT协议的格式把数据发到OneNet同时监听来自OneNet的控制命令。这里我不可能把整个工程代码贴出来但会把最核心的逻辑和代码片段告诉你你完全可以基于野火提供的MQTT例程进行修改。首先连接网络。野火指南者板子一般通过ESP8266 WiFi模块联网。你需要正确配置串口比如USART3与ESP8266通信发送AT指令让它连接到你的路由器。这部分代码野火的例程里通常很完善确保你的WiFi名称和密码填对就行。其次处理MQTT通信。这是重点。OneNet的MQTT旧版协议接入相对直接。你需要在程序中填写设备信息在代码里定义你的产品IDPRODUCT_ID、设备名称DEVICE_ID和鉴权信息API_KEY。这些信息从哪里来我们马上在OneNet平台创建。发布Publish数据读取DHT11得到温度和湿度后你需要将它们组包成JSON格式通过MQTT发布到特定的主题Topic。OneNet的格式类似$dp。下面是发布温度数据的一个示例代码思路// 假设已经读取到温度值 temperature char data_stream[100]; // 构建数据点格式为{“datastreams”:[{“id”:”temperature”, “datapoints”:[{“value”:%f}]}]} sprintf(data_stream, “{\”datastreams\”:[{\”id\”:\”temperature\”, \”datapoints\”:[{\”value\”:%.1f}]}]}”, temperature); // 然后调用MQTT发布函数发布到 $dp 主题 mqtt_publish(client, “$dp”, data_stream, strlen(data_stream), QOS0);湿度数据同理只是把数据流ID”id”改为”humidity”。订阅Subscribe与接收控制命令为了让网页能控制LED设备必须订阅一个用来接收命令的主题。当你在网页点击开关时OneNet会向这个主题发送消息。设备需要解析这个消息。通常命令可能是一个简单的字符串比如“LEDON”或“LEDOFF”。在MQTT的接收回调函数里你需要判断消息内容然后控制PB5引脚输出高电平或低电平从而点亮或熄灭LED。// 在MQTT消息到达的回调函数中 void message_arrived(MessageData* md) { char* msg_payload (char*)md-message-payload; if (strstr(msg_payload, “LEDON”) ! NULL) { GPIO_SetBits(GPIOB, GPIO_Pin_5); // 点亮LED } else if (strstr(msg_payload, “LEDOFF”) ! NULL) { GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 熄灭LED } }最后关于DHT11的驱动。网上有很多成熟的代码注意处理好时序和校验就行。确保你能稳定地读出温度和湿度值。把上述所有逻辑整合到一个循环里比如每5秒读取一次传感器并上报数据同时保持MQTT连接不断开监听命令你的下位机程序就准备好了。编译、下载到开发板接通电源硬件部分就暂时告一段落。3. 云端战场在OneNet上创建产品、设备与数据流现在我们转战OneNet云端。这是整个项目的“大脑”和“调度中心”。请跟着我的步骤一步一步来一步错可能后面就关联不上了。3.1 创建产品与设备首先注册并登录OneNet平台。进入控制台后找到左侧的多协议接入选择MQTT旧版。这里注意OneNet有新旧协议我们选择旧版是因为协议简单例程多更容易上手。点击添加产品。产品名称可以叫“家庭环境监控”设备接入协议选“MQTT旧版”其他类别、网络运营商等根据情况选择或默认即可。创建成功后你会进入产品概况页面。请立刻记下两样东西产品IDPID和Master-APIkey。这两个就像你产品的“身份证”和“万能钥匙”等下写单片机代码和配置可视化界面都要用到。接下来进入设备列表点击添加设备。设备名称我们设为“My_Device_01”可以自己起但也要记牢因为它是设备的唯一标识。鉴权信息即设备编号可以填和设备名称一样或者用平台自动生成的。创建成功后你会看到设备处于“未激活”状态。这是正常的只要你的单片机程序正确运行并连接上来它就会变成“在线”。3.2 创建关键的数据流模板数据流Datastream是OneNet里一个非常重要的概念。你可以把它理解为一个数据标签或者数据通道。我们计划上传温度和湿度并接收LED控制命令所以需要创建三个数据流。进入产品详情页找到数据流模板点击添加数据流。第一个ID填temperature单位填“℃”这用来接收温度数据。第二个ID填humidity单位填“%RH”这用来接收湿度数据。第三个ID填ledFlag这个比较特殊它用来下发控制命令。我们不需要给它上传数据但它必须存在我们才能在可视化界面上绑定一个开关控件到这个数据流上从而实现命令下发。为什么ledFlag数据流是必须的这是OneNet可视化控件的工作机制决定的。开关控件需要绑定到一个数据流上当你操作开关时平台会向这个数据流对应的“命令主题”发送数据。你的设备订阅了这个主题就能收到命令。所以即使这个数据流不会有点数据上传它作为一个“命令通道”的标识也必须提前创建好。至此云端的基础设施就搭建好了一个产品、一个设备、三个数据流。接下来就是让我们的网页界面变得好看又好用的关键一步——数据可视化。4. 打造可视化面板控件绑定与数据过滤器的魔法这是最有成就感的一步我们将创建一个专属的仪表盘把冰冷的数据变成直观的图表和可操作的开关。4.1 创建可视化项目并添加控件在OneNet控制台找到应用管理-数据可视化点击新建项目。选择“2D-空白模板”给你的项目起个名字比如“我的环境监控中心”。进入编辑界面后你会看到一个空白的画布。从左侧的组件库中拖拽需要的控件到画布上仪表盘用来显示当前温度。拖出来后可以调整大小和位置。基本折线图用来显示湿度的历史变化趋势。按钮或开关控件用来控制LED。在“控制”分类里可以找到。4.2 核心操作数据源绑定这是让控件“活”起来的关键。以温度仪表盘为例选中画布上的仪表盘控件。在右侧的“数据”选项卡中点击“数据源选择”。点击“新建”数据类型选择“OneNET”。在弹出的配置窗口中你需要填写几个关键信息产品ID就是前面让你记下的PID。AccessKey填写你在产品概况页面记下的Master-APIkey。设备选择你创建的设备“My_Device_01”。数据流选择我们创建的“temperature”。保存这个数据源配置。完成这步后仪表盘已经和你的设备温度数据流关联上了。但此时你可能看不到数据或者数据显示格式不对这就需要用到下一个神器——数据过滤器。4.3 数据过滤器让数据乖乖听话数据过滤器其实就是一段简短的JavaScript代码它的作用是对从云端取到的原始数据进行“加工”转换成控件能直接显示的样子。这是很多新手会卡住的地方我详细解释一下。对于仪表盘温度 仪表盘通常只需要显示最新的一个数据点。OneNet返回的数据是一个数组我们需要取出数组的最后一项。点击“数据”选项卡下的“私有过滤器”将代码替换为function last(arr) { var len arr ? arr.length : 0; if (len) return arr[len - 1]; } return [{ value: last(data).value, name: ‘温度’ }];这段代码定义了一个last函数来取数组最后一项然后返回一个包含value数值和name名称的对象。这样仪表盘就能正确显示最新的温度值和“温度”这个标题了。对于折线图湿度 折线图需要一系列带有时间戳和数值的数据点。OneNet返回的数据通常包含update_at更新时间和value值。我们需要把它们转换成折线图需要的x时间轴和y数值轴格式。在折线图的“私有过滤器”中输入data.forEach((item, index) { item.x item.update_at; item.y item.value; }); return data;这段代码遍历原始数据数组为每个数据点添加了x和y属性。然后在“样式” - “数据系列”中将“系列名”改为“湿度”这样图例就会显示为“湿度”。对于开关按钮LED控制 开关的配置略有不同它主要涉及“命令下发”。首先同样需要绑定数据源选择我们创建的“ledFlag”数据流。然后在“样式” - “数据系列”中你会看到“系列1”和“系列2”可能叫“开启”和“关闭”。在“系列1”的“命令内容”里填写你单片机程序约定好的开灯命令比如LEDON。在“系列2”的“命令内容”里填写关灯命令比如LEDOFF。这样配置后当你点击网页上的开关到“开”的状态OneNet就会向ledFlag数据流对应的命令主题发送字符串“LEDON”切换到“关”则发送“LEDOFF”。你的单片机程序只要解析这两个字符串并执行相应动作即可。5. 联调与排错让整个系统跑起来所有配置都完成后点击可视化页面的“预览”或“发布”。这时一个专业的监控面板就出现在你面前了。但很可能它还没有数据或者控制不灵。别急联调是必经之路。5.1 检查数据流首先回到OneNet控制台进入你的设备详情页查看“数据流展示”。如果下位机程序正确运行你应该能看到temperature和humidity数据流下有带时间戳的数据点不断更新。如果这里没有数据问题一定出在下位机检查网络连接ESP8266是否连上了WiFi串口调试助手看看AT指令响应。检查MQTT连接参数产品ID、设备名、API Key是否百分百正确大小写、标点都要注意。检查数据发布代码发布的主题是不是$dp数据格式是不是正确的JSON可以用串口打印出要发送的字符串看看。检查硬件DHT11接线是否牢固代码里的引脚定义对吗5.2 检查控制命令如果数据能显示但开关控制不了LED问题可能在下行链路。检查设备订阅确保你的单片机程序正确订阅了接收命令的Topic。对于旧版MQTT命令主题通常是$creq/{消息ID}但具体需要参考OneNet文档和你的代码实现。一个更简单的方法是在设备详情页的“命令下发”历史中当你操作网页开关时看看是否有命令下发记录。如果有记录但设备没反应就是设备端解析命令的代码有问题。检查命令解析代码确认单片机里message_arrived回调函数是否正确解析了“LEDON”和“LEDOFF”字符串。字符串比较是否准确控制GPIO的代码是否执行检查开关配置回顾第4.3步开关控件绑定的数据流是不是ledFlag命令内容填写是否正确5.3 界面美化与优化当一切功能正常后你可以尽情美化你的面板。在控件的“样式”选项卡里你可以调整颜色、字体、背景、单位显示等等。把仪表盘的最大最小值设置成合理的范围比如温度0-50℃给折线图加上平滑曲线调整一下布局让它看起来就像一个真正的工业监控界面。我自己的经验是第一次成功看到数据在网页上跳动远程点亮LED的那一刻感觉特别棒。这个过程里最关键的其实就是“对应关系”设备代码里的数据流ID要和平台创建的一致可视化控件绑定的数据源其产品、设备、数据流要选对命令字符串要上下行统一。把这些“通道”一一打通系统就跑起来了。这个项目虽然小但它完整地走通了物联网的感知、传输、云平台处理、应用展示全链路理解了它你再去做更复杂的项目心里就有底了。