摘要:这是一篇偏硬件方面的帖子,软件在我前几个帖子里面,这篇帖子主要讲怎么通过微信小程序连接华为云后端,实现华为云命令下发,控制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
  • 设备ID66823ab72ca97925e0670ee9_zhineneng001
  • 设备密钥371420four
  • 属性上报主题$oc/devices/{deviceId}/sys/properties/report
  • JSON数据格式需严格转义,包含服务ID和属性字段

3.4错误处理机制

每个AT指令执行后都包含响应检测和重试机制:

  1. 检测响应缓冲区是否存在预期关键字(如"+HMCON OK")
  2. 未收到正确响应时自动重发指令
  3. 每次发送前清空接收缓冲区避免数据干扰

3.5典型应用场景

完成上述连接后,设备可实现:

  • 定时上报传感器数据
  • 接收云端下发的控制指令
  • 实现设备影子同步
  • 支持OTA固件升级

希望这篇分享贴对大家能有帮助!

 

 

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐