手把手教你完成STM32毗连阿里云平台,代码开源!!! ...

打印 上一主题 下一主题

主题 798|帖子 798|积分 2394

一、概要



  • 利用STM32单片机毗连阿里云平台,实现数据上传与接收
二、整体架构流程

项目详细说明主控STM32F103ZET6通讯串口通讯,波特率:115200、数据位:8、停止位:1、校验:None开发软件STM32CubeMX硬件ESP32-01S 将ESP32-01S单片机串口毗连到STM32串口二,利用AT指令控制wifi模块,毗连阿里云平台;
三、软件流程

3.1 STM32CubeMX生成根本软件


  • 选择主芯片,这里我选择STM32F103ZET6,根据本身环境选择,常用的型号都可以,思绪是一样的;
  • 配置调试口
    这里需要配置为图中所示,因为我用的STLink仿真器,利用Jlink也是一样的。
  • 配置时钟
    因为我利用的是开发板,上面有外部晶振,所以这里我配置为外部时钟。各人可以根据本身的环境选择;
    这里我利用的时钟为外部8M晶振,系统时钟为72M,可以按照这个配置;
  • 串口配置
    因为这里需要和esp32-01s通讯,所以需要配置串口,波特率115200,其他稳定。我也配置了串口DMA,看各自需求,实在也可以不消配置;

    以上就是根本工程配置,输出用Keil编程框架;
3.2 ESP32-01S初始化及配置

这里接纳的是AT指令操作,说直白一点就是,我单片机发送这些指令就可以控制esp32-01s这个wifi模块操作相应动作;
   AT:测试AT启动,返回OK
AT+RST:重启模块,返回OK
AT+GMR:查看版本信息,返回 OK ,为8位版本号
AT+CWJAP=“WiFi名字”,“密码”:毗连WiFi
AT+CWAUTOCONN=1:设置开机主动连入Wifi
AT+CIPMUX=1:设置单毗连
AT+CIOBAUD=115200:修改波特率
  指令说明实例AT+RST软重启模块TX:OKAT+RESTORE规复出厂设置TX:OK

  • 串口调试助手测试
    这里发送了一条复位指令,串口会返回相应指令,这样的话,我们STM32就知道是否执行乐成。这就是与wifi模块根本的通讯标题;
  • 毗连wifi热点
    首先我们需要对wifi模块进行小小的更新,买到手的模块大概是AT固件,我们需要更新为MQTT固件,详细操作不在这里说明,网上很多;
   我们先来毗连一下整个毗连流
1.刚上电,我们可以复位一下wifi模块,发送指令:AT+RST
2.可以重置一下旧配置,以免影响本次操作,发送指令:AT+RESTORE
3.我们需要让wifi模块主动去毗连手机热点,全部需要配置一下模式,发送指令:AT+CWMODE=1
4.因为模块是不知道我们手机热点的名字和密码的,全部我们需要告知模块这两个信息,发送指令AT+CWJAP=“wifi名字”,“wifi密码”
  以上操作后在手机上就会看到有设备毗连,名字大概就是esp32…,类似,大差不差的

  • 毗连阿里云平台
    毗连阿里云需要本身注册一个平台账号,在平台创建产品与设备,这里就不在阐述了,网上很多的;附上截图一张


    上面为阿里云平台入口,创建好产品和设备后得到一些数据如下:
    这里的MQTT参数就是我们需要的,需要通过AT指令告知wifi模块这里信息数据
3.3 STM32软件实现

以上操作都是通过串口发送字符串,所以我们需要实现的是STM32串口发送字符串,参考程序如下:
  1. void ESP8266_SendString(uint8_t *str,uint8_t len)
  2. {
  3.         uint8_t i=0;
  4.         for(i=0;i<len;i++)
  5.         {
  6.                 USART2->DR = *str;
  7.                 str++;
  8.                 HAL_Delay(1);
  9.         }
  10. }
  11. uint8_t ESP8266_SendCmd(uint8_t *cmd,uint8_t *res)
  12. {
  13.         uint8_t num = 200;
  14.         ESP8266_Clear();
  15.         ESP8266_SendString(cmd,strlen((const char *)cmd));
  16.         while(num--)
  17.         {
  18.                 if(strstr((const char*)esp_buff,(const char *)res)!=NULL)
  19.                 {
  20.                         ESP8266_Clear();
  21.                         return 0;
  22.                 }
  23.                 HAL_Delay(10);
  24.         }
  25.         return 1;
  26. }
复制代码
通过上述两个函数,就可以简单实现AT指令发送了,例如:
  1. #define          WIFI_NAME           "spx24"       // wifi名
  2. #define          WIFI_PASS                "52xiaobai999"                // wifi密码
  3. void ESP8266_Init(void)
  4. {
  5.         HAL_UART_Receive_DMA(&huart2,esp_buff,ESPBUFF_MAX_SIZE);    // 开启DMA接收
  6.   __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);      // 开启串口的空闲中断
  7.         while(ESP8266_SendCmd("AT+RST\r\n", "ready"))
  8.        
  9.         while(ESP8266_SendCmd("AT\r\n","OK")){}
  10.                
  11.         while(ESP8266_SendCmd("AT+CWMODE=1\r\n","OK")){}
  12.                
  13.         while(ESP8266_SendCmd("AT+CWJAP=""WIFI_NAME"",""WIFI_PASS""\r\n","OK")){}
  14. }
复制代码
毗连阿里云也是一样的原理,替换成本身的参数即可:
  1. // 设置阿里账号,上云
  2. #define                 ALI_USERNAME                    "xxx&k1v5xYRUyUn"                     
  3. #define                 ALICLIENTLD                    "xxx"       
  4. #define                 ALI_PASSWD                            "xxx"
  5. #define                 ALI_MQTT_HOSTURL            "xxx"
  6. #define                 ALI_PORT                            "1883"       
  7. #define      ALI_TOPIC_SET          "/sys/k1v5xYRUyUn/xxx/thing/service/property/set"
  8. #define      ALI_TOPIC_POST         "/sys/k1v5xYRUyUn/xxx/thing/event/property/post"
  9. void Ali_Yun_Init(void)
  10. {
  11.         //设置用户名,密码
  12.         while(ESP8266_SendCmd("AT+MQTTUSERCFG=0,1,"NULL",""ALI_USERNAME"",""ALI_PASSWD"",0,0,""\r\n","OK")){}
  13.         HAL_Delay(10);
  14.         // 设置客服id
  15.         while(ESP8266_SendCmd("AT+MQTTCLIENTID=0,""ALICLIENTLD""\r\n","OK")){}
  16.                
  17.         // 连接腾讯云  AT+MQTTCONN=0,"iot-06z00b28nanp9ew.mqtt.iothub.aliyuncs.com",1883,1
  18.         while(ESP8266_SendCmd("AT+MQTTCONN=0,""ALI_MQTT_HOSTURL"",1883,1\r\n","OK")){}
  19.                
  20.         Ali_Yun_Topic();
  21. }
  22. void Ali_Yun_Topic(void)
  23. {
  24.         //"AT+MQTTPUB=0,"发布的主题","";
  25.         while(ESP8266_SendCmd("AT+MQTTSUB=0,""ALI_TOPIC_SET"",0\r\n","OK")){}
  26.                
  27.         while(ESP8266_SendCmd("AT+MQTTSUB=0,""ALI_TOPIC_POST"",0\r\n","OK")){}
  28. }
复制代码
现在需要上传数据至云平台,或者从云平台下发指令等等操作。在云平台创建一些模块,例如,温度湿度,LED灯等。

单片机软件实现:
  1. void Ali_Yun_Send(void)
  2. {
  3.     uint8_t msg_buf[1024];
  4.         uint8_t params_buf[1024];
  5.         uint8_t data_value_buf[24];
  6.         uint16_t move_num = 0;
  7.         cJSON *send_cjson = NULL;
  8.    
  9.         char *str = NULL;
  10.         int i=0;       
  11.         cJSON *params_cjson = NULL;
  12.         memset(msg_buf,0,sizeof(msg_buf));
  13.         memset(params_buf,0,sizeof(params_buf));
  14.         memset(data_value_buf,0,sizeof(data_value_buf));
  15.         send_cjson = cJSON_CreateObject();
  16.         params_cjson = cJSON_CreateObject();
  17.         cJSON_AddNumberToObject(params_cjson,"temperature",temp_value++);
  18.         cJSON_AddNumberToObject(params_cjson,"Humidity",humi_value++);
  19.         cJSON_AddItemToObject(send_cjson, "params", params_cjson);
  20.         cJSON_AddItemToObject(send_cjson,"version",cJSON_CreateString("1.0.0"));
  21.         str = cJSON_PrintUnformatted(send_cjson);
  22.         for(i=0;*str!='\0';i++)
  23.         {
  24.                 params_buf[i] = *str;
  25.                 if(*(str+1)=='"'||*(str+1)==',')
  26.                 {
  27.                         params_buf[++i] = '\\';
  28.                 }
  29.                 str++;
  30.                 move_num++;               
  31.         }
  32.         str = str - move_num;
  33.         sprintf((char *)msg_buf,"AT+MQTTPUB=0,""ALI_TOPIC_POST"","%s",0,0\r\n",params_buf);
  34.         ESP8266_SendCmd(msg_buf,"OK");
  35.         ESP8266_Clear();
  36.         cJSON_Delete(send_cjson);
  37.         if(str!=NULL)
  38.     {
  39.                 free(str);
  40.                 str = NULL;
  41.         }
  42. }
复制代码
四、技能细节

4.1 MQTT


  • 什么是MQTT
   消息队列遥测传输协议,是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,并且该协议构建于TCP/IP协议之上,我们知道TCP协议本身就具有高可靠性的特点,因此基于其上的MQTT协议同样也是具有高可靠、低开销的特点,之所以低开销,是以为MQTT协议传输的最小的报文也只有两个字节。
  

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、署理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息署理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部门


  • Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
  • payload,可以理解为消息的内容,是指订阅者详细要利用的内容
在我们这里,单片机上传数据时,我们就作为发布者,当接收数据时,我们则作为订阅者,其他操作我们不消过多关心;

  • cJson
   JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,接纳完全独立于编程语言的文本格式来存储和表现数据。简洁和清晰的条理布局使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有用地提拔网络传输效率
  语法规则如下:
JSON 语法衍生于 JavaScript 对象标志法语法:


  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号{}容纳对象
  • 方括号[]容纳数组
举个例子:
  1. {
  2.         "information":{
  3.                 "school": "编程大学",
  4.              "grade":   4,
  5.              "专业":    "软件工程"
  6.         }
  7. }
复制代码
对于我们这里来说,为了完成这个功能,不消相识过多,能用即可。
小结

以上是一个简单的STM32毗连阿里云平台的实例,没有过多操作,很简单。也是为了方便记载本身调试心得,内容有错地方还请各位指出,共同砚习进步;实现这个功能之后就可以由此衍生,如下:


  • 完成真实的数据上传,例如温湿度,GPS定位,烟雾等;
  • 可以云平台下发指令开灯,关灯,以及控制电机等;
  • 也可以编写App对接平台,长途控制单片机;
  • 还可以通过云平台进行IAP升级,云平台好像支持这个长途升级功能;
最后这个程序很简单,网上也有很多参考教程,我也可以发出来给各人一起参考;

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小秦哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表