很多刚接触物联网开发的同学都会遇到一个经典难题:如何用最低成本实现手机远程监控硬件?市面上现成的IoT平台应用虽然方便,但就像用别人搭好的积木,总感觉少了点创造乐趣。我当年做毕业设计时也纠结过这个问题,直到发现E4A中文安卓编程+OneNET MQTT这个黄金组合。
E4A(易安卓)最大的优势是零Java基础也能快速上手。记得我第一次打开Android Studio被满屏英文吓退时,E4A的中文界面简直像救星。它的语法类似VB,控件拖拽就能生成界面,配合OneNET提供的MQTT协议,三天就能做出能实际跑通的监控APP。有次我帮学弟调试课设,从安装软件到APP控制LED灯亮灭,总共只用了6小时。
硬件成本也低到离谱。STM32F103C8T6开发板(俗称"蓝色药丸")淘宝25块钱,ESP8266-01S模块15元,加上手机和免费OneNET账号,整套方案不超过50元。相比动辄几百元的商业物联网套件,这个组合对学生党特别友好。
先列个我的实战验证过的硬件清单:
有个坑我踩过三次:ESP8266-01S的供电必须稳定。最初用USB转TTL的3.3V供电,WiFi经常断连,后来改用AMS1117稳压模块单独供电再没出过问题。实测工作时电流峰值能达到200mA,普通USB口的3.3V输出带不动。
E4A安装包只有200MB左右,但要注意:
OneNET平台配置分三步:
官方例程最坑的地方是HSE_VALUE时钟配置。我用的STM32F103C8T6板载8MHz晶振,但例程默认是12MHz,不修改会导致串口通信乱码。具体要改两个地方:
c复制// stm32f10x.h 第119行
#define HSE_VALUE ((uint32_t)8000000)
// system_stm32f10x.c 第105行
SetSysClockTo72(); // 确保系统时钟设为72MHz
WiFi连接超时处理也很重要。建议加个重试计数器:
c复制uint8_t wifi_retry = 0;
while(ESP8266_Init() != SUCCESS) {
if(++wifi_retry > 5) {
Beep_Alert(3); // 蜂鸣器报警
break;
}
DelayMs(1000);
}
原始例程的OneNet_FillBuf()函数太简陋,我优化后的版本支持动态数据追加:
c复制void Build_JSON_Data(cJSON *root, const char *key, float value) {
if(value != INVALID_DATA) { // 定义无效数据常量
cJSON_AddNumberToObject(root, key, value);
}
}
char* Generate_JSON() {
cJSON *root = cJSON_CreateObject();
Build_JSON_Data(root, "Temp", DHT11_GetTemp());
Build_JSON_Data(root, "Humi", DHT11_GetHumi());
Build_JSON_Data(root, "Light", Light_Sensor_Read());
char *json_str = cJSON_PrintUnformatted(root);
cJSON_Delete(root);
return json_str;
}
这个方案用cJSON库处理复杂数据结构更灵活,还能自动跳过传感器故障时的无效数据。
E4A的界面设计器比Android Studio简单十倍。分享几个实用技巧:
这是我常用的控件命名规范:
E4A的mqtt通讯组件有七个关键事件,最常用的是这三个:
basic复制事件 mqtt通讯1.连接结果(连接结果 为 整数型)
如果 连接结果 = 0 则
弹出提示("连接成功")
订阅按钮.可用 = 真
否则
弹出提示("连接失败:" & 连接结果)
结束 如果
结束 事件
事件 mqtt通讯1.收到消息(消息主题 为 文本型, 消息内容 为 字节型())
变量 json 为 文本型 = 字节到文本(消息内容, "UTF-8")
解析_JSON数据(json) ' 自定义解析过程
结束 事件
事件 mqtt通讯1.断开连接()
连接按钮.标题 = "连接"
订阅按钮.可用 = 假
结束 事件
重要提示:收到消息事件里不要做耗时操作,否则会导致界面卡顿。复杂处理建议用"启动线程"。
用E4A的数据库组件实现本地存储:
basic复制事件 保存数据按钮.被单击()
变量 SQL 为 文本型 = "INSERT INTO sensor_data VALUES('" &
取现行时间() & "','" &
温度值标签.标题 & "','" &
湿度值标签.标题 & "')"
数据库1.执行SQL(SQL)
结束 事件
配合折线图组件就能做历史数据可视化,毕业设计立马提升一个档次。
在OneNET平台创建一个产品下挂多个设备后,APP端可以用列表框实现设备切换:
basic复制事件 设备列表.项目被单击(项目索引 为 整数型)
当前设备ID = 设备列表.取项目文本(项目索引)
mqtt通讯1.断开连接()
mqtt通讯1.连接服务器(..., 当前设备ID, ...)
结束 事件
记得在连接前先清空订阅列表,否则会出现消息串扰。
有次调试时遇到灵异现象:APP只能收到部分数据。最后发现是单片机串口缓冲区溢出,在ESP8266_SendData()后加了100ms延迟就解决了。所以物联网开发一定要有耐心!