[物联网设计竞赛国一]技术分享之STM32端协同L610控制命令下发
本文介绍了通过微信小程序连接华为云后端控制STM32的硬件实现方案。硬件端主要处理微信小程序下发的串口命令(字符型1/0),需注意ASCII码转换(48/49)。系统采用4G广和通模组进行数据传输,详细说明了模块初始化、SIM卡检测、信号查询、注网及华为云连接等AT指令流程,并分享了L610模块拨号和连接华为云的具体代码实现。该方案实现了远程控制功能,但4G模块存在偶发掉线问题,需断电重启解决。
摘要:这是一篇偏硬件方面的帖子,软件在我前几个帖子里面,这篇帖子主要讲怎么通过微信小程序连接华为云后端,实现华为云命令下发,控制32来实现功能。感谢魔乐社区的收录支持!
一.硬件端解析
1.1准备部分
软件部分已经准备好,微信小程序端已经部署好 ,详情点击软件端配置步骤
1.2 STM32端进行数据的处理
实现了软件功能之后就可以实现按钮命令下发,命令下发其实就是在串口发一条数据,根据我在微信小程序里面编的程序,按下开的按键,会在串口自动发一个开关是字符型1的信息,按下关的按键,会在串口发一个开关是字符型0的信息。
我们在32端做的就是解析这段信息,我是直接读取开关的状态,看发送的信息的状态是1还是0,从而来控制32,这里还有一个坑,1和0都是字符型的,0的ascii是48,1的ascii是49,在32里面判断的时候要转换一下,不然就不会有任何效果。接下来是这段代码分享(只是解析信息部分的代码)
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"SpraySwitchParam");
strx1=strstr((const char*)RxBuffer,(const char*)"request_id=");
len=strlen(strx);
number=strx[18];//把字符从信息中提取出来
printf("%d\n",number);
if(number==48){//这里是判断是否接收到字符0
printf("1success\n");
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET);
}
if(number==49){//这里是判断是否接收到字符1
printf("0success");
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_RESET);
}
printf("p success");
HAL_Delay(500);
printf("messagúled=%c\n",number);
Clear_Buffer();
二. 4G通讯模组的运用
由于我们用的是4G广和通模组,所以我们的数据传输都是用的4G模块,难度也加大了很多,比传统的wifi难了不止一点,4G通讯需要拨号,查询信息等一系列过程,而且l610特别喜欢掉线,我觉得是有点玄学在的,可能突然就好了,也可能突然就掉线了,不过解决方法就是断电重启,一切问题都解决了!目前经过测试稳定运行3-4个小时没有问题。
2.1模块初始化和联网拨号过程
MPU6050_Init();
HAL_UART_Receive_IT(&huart1,&Res,1);
HAL_GPIO_WritePin(air_GPIO_Port,air_Pin,GPIO_PIN_RESET);
printf("initialize\r\n");//模块初始化
HAL_Delay(5000);
printf("ATI\r\n");//查询版本信息
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"Fibocom");
while(strx==NULL)
{
Clear_Buffer();
printf("A fail");
HAL_Delay(1000);
printf("ATI\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"Fibocom");
}
Clear_Buffer();
printf("A success");
HAL_Delay(1000);
//查询sim卡
printf("AT+CPIN?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"READY");
while(strx==NULL)
{
Clear_Buffer();
printf("B fail");
HAL_Delay(1000);
printf("AT+CPIN?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"READY");
}
Clear_Buffer();
printf("B success");
HAL_Delay(1000);
//查询信号
printf("AT+CSQ?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+CSQ");
while(strx==NULL)
{
Clear_Buffer();
printf("C fail");
HAL_Delay(1000);
printf("AT+CSQ?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+CSQ");
}
Clear_Buffer();
printf("C success");
HAL_Delay(1000);
//
//查询注网信息
printf("AT+CGREG?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"0,1");
while(strx==NULL)
{
Clear_Buffer();
printf("D fail");
HAL_Delay(1000);
printf("AT+CGREG?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"0,1");
}
Clear_Buffer();
printf("D success");
HAL_Delay(1000);
//请求ip
printf("AT+MIPCALL?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+MIPCALL:1");
while(strx==NULL)
{
Clear_Buffer();
//printf("E fail");
HAL_Delay(1000);
printf("AT+MIPCALL=1\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+MIPCALL:");
}
Clear_Buffer();
printf("E success");
HAL_Delay(1000);
//ܹ基站定位
printf("AT+GTGIS=?\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+CTGIS");
while(strx==NULL)
{
Clear_Buffer();
printf("H fail");
HAL_Delay(1000);
printf("AT+GTGIS=6\r\n");
HAL_Delay(1000);
strx=strstr((const char*)RxBuffer,(const char*)"+GTGIS");
}
Clear_Buffer();
printf("H success");
HAL_Delay(1000);
2.2 l610优化改进
2.2.1硬件层面优化
检查天线匹配电路和SIM卡接触,确保使用高增益天线并远离干扰源。模块供电需稳定,建议增加大容量电容(如1000μF)缓冲电压波动。
2.2.2软件策略增强
引入网络状态监控线程,周期性发送AT+CGREG?检测注册状态。实现自动重拨机制,当检测到掉线时执行AT+MIPCALL=0后再重新拨号。信号质量阈值判断可加入以下逻辑:
int rssi = atoi(strx + 5); //解析AT+CSQ响应
if(rssi < 10) {
HAL_GPIO_WritePin(reset_GPIO_Port, reset_Pin, GPIO_PIN_SET);
HAL_Delay(200);
HAL_GPIO_WritePin(reset_GPIO_Port, reset_Pin, GPIO_PIN_RESET);
}
2.2.3代码结构重构
采用状态机模式替代线性流程,定义枚举类型管理各阶段状态:
typedef enum {
INIT_STAGE,
SIM_CHECK_STAGE,
NET_REG_STAGE,
DIAL_STAGE
} ModemState;
优化AT命令处理使用环形缓冲区,增加超时计数器和错误重试上限:
#define MAX_RETRY 3
uint8_t retry_count = 0;
while(strx == NULL && retry_count++ < MAX_RETRY) {
// ...原有重试逻辑...
}
if(retry_count >= MAX_RETRY) hardware_reset();
2.2.4增强调试手段
在关键节点添加详细日志记录,建议输出到本地存储或通过AT+CMEE=2开启详细错误报告。可定期执行AT+COPS?查询当前运营商信息辅助诊断。
2.2.5功耗管理策略
非活跃时段可启用PSM模式,通过AT+CPSMS=1配置省电参数。数据传输间隔超过15分钟时建议主动断开连接AT+MIPCALL=0。
通过上述多维度改进,可显著提升L610模块的持续运行时长,理论可达24小时以上稳定连接。实际部署时建议配合网络信号扫描工具(如AT+COPS=?)选择最优运营商。
三.L610模块连接华为云MQTT的代码实现
以下为基于L610模块通过AT指令连接华为云物联网平台的完整流程代码示例,包含拨号连接和MQTT协议交互关键步骤。
3.1初始化网络连接
// 发送拨号指令建立网络连接
printf("AT+CGACT=1,1\r\n");
HAL_Delay(1000);
strx = strstr((const char*)RxBuffer, (const char*)"OK");
while(strx == NULL) {
Clear_Buffer();
printf("Dial fail");
HAL_Delay(1000);
printf("AT+CGACT=1,1\r\n");
HAL_Delay(1000);
strx = strstr((const char*)RxBuffer, (const char*)"OK");
}
Clear_Buffer();
printf("Network connected");
HAL_Delay(1000);
3.2配置MQTT连接参数
// 设置华为云MQTT连接参数
printf("AT+HMCON=0,60,\"57860eefab.iot-mqtts.cn-north-4.myhuaweicloud.com\",\"1883\",\"66823ab72ca97925e0670ee9_zhineneng001\",\"371420four\",0\r\n");
HAL_Delay(1000);
strx = strstr((const char*)RxBuffer, (const char*)"+HMCON OK");
while(strx == NULL) {
Clear_Buffer();
printf("MQTT connect fail");
HAL_Delay(1000);
printf("AT+HMCON=0,60,\"57860eefab.iot-mqtts.cn-north-4.myhuaweicloud.com\",\"1883\",\"66823ab72ca97925e0670ee9_zhineneng001\",\"371420four\",0\r\n");
HAL_Delay(1000);
strx = strstr((const char*)RxBuffer, (const char*)"+HMCON OK");
}
Clear_Buffer();
printf("MQTT connected");
HAL_Delay(1000);
3.3上报设备属性数据
// 发布属性到华为云物联网平台
printf("AT+HMPUB=2,\"$oc/devices/66823ab72ca97925e0670ee9_zhineneng001/sys/properties/report\",77,\"{\\\"services\\\":[{\\\"service_id\\\":\\\"Sprayswitchcontrol\\\",\\\"properties\\\":{\\\"Weight\\\":20}}]}\"\r\n");
HAL_Delay(1000);
strx = strstr((const char*)RxBuffer, (const char*)"+HMPUB OK");
while(strx == NULL) {
Clear_Buffer();
printf("Publish fail");
HAL_Delay(1000);
printf("AT+HMPUB=2,\"$oc/devices/66823ab72ca97925e0670ee9_zhineneng001/sys/properties/report\",77,\"{\\\"services\\\":[{\\\"service_id\\\":\\\"Sprayswitchcontrol\\\",\\\"properties\\\":{\\\"Weight\\\":20}}]}\"\r\n");
HAL_Delay(1000);
strx = strstr((const char*)RxBuffer, (const char*)"+HMPUB OK");
}
Clear_Buffer();
printf("Publish success");
HAL_Delay(1000);
3.3关键参数说明
- MQTT服务器地址:
57860eefab.iot-mqtts.cn-north-4.myhuaweicloud.com - 设备ID:
66823ab72ca97925e0670ee9_zhineneng001 - 设备密钥:
371420four - 属性上报主题:
$oc/devices/{deviceId}/sys/properties/report - JSON数据格式需严格转义,包含服务ID和属性字段
3.4错误处理机制
每个AT指令执行后都包含响应检测和重试机制:
- 检测响应缓冲区是否存在预期关键字(如"+HMCON OK")
- 未收到正确响应时自动重发指令
- 每次发送前清空接收缓冲区避免数据干扰
3.5典型应用场景
完成上述连接后,设备可实现:
- 定时上报传感器数据
- 接收云端下发的控制指令
- 实现设备影子同步
- 支持OTA固件升级
希望这篇分享贴对大家能有帮助!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)