[活动] 二姨家买单活动】之二:NB模块BC26模块MQTT测试

[复制链接]
1149|0
 楼主| abner_ma 发表于 2022-4-2 17:14 | 显示全部楼层 |阅读模式
     接上一篇【二姨家买单活动】之一:万物物联之NB模块牛刀小试   继续捣鼓BC26模块。

     为了满足当下IoT应用的多样化需求,市面上开放了包括CoAP、XMPP和DDS在内的多种协议,可供各个应用场景按需选择。MQTT是IBM开发的一个即时通讯协议,基于TCP的,号称是可以支持所有的平台。CoAP是运行于UDP之上的,并且非常的小巧,最小只有4个字节。可以说两者都是营运物联网大趋势和为了适应M2M而生的,相比于其他的通信协议也有较大的优势。其中,消息队列遥测传输(MQTT)及其衍生协议MQTT-SN正广泛应用在日益普遍的低功耗广域(LPWA)网络中。MQTT,目前物联网的最主要的协议,基本所有的云平台都是基于MQTT协议,比如阿里云华为云,中国移动的oneNet、百度的云平台也都支持MQTT的接入
1、MQTT 协议
作为一种轻量级协议,MQTT拥有简单紧凑的架构和较小的代码占用空间,适用于低成本、低功耗的IoT微控制设备。MQTT可在TCP/IP协议上兼容运行,专攻延迟较高、质量不佳的网络环境。该协议适用于具有以下通信需求的应用:
   使用极小带宽
   无线网络通信
   低功耗
   必要时保证高可靠性
   对处理和内存资源的需求很低
   MQTT在IoT多种应用中都备受青睐,如智能表计、资产追踪工具和工业设备的互联传感器。凭借对有限带宽的高效利用,因此MQTT非常适用于网络成本高、功耗大的应用场景,例如远程传感器阵列就需要在现场自主运行数年且期间无需维修。MQTT是多个客户端通过一个中央服务器传递信息的多对多协议,能高效地将信息分发给一个或多个订阅者,加之其代码占用空间小,便使得MQTT成为移动应用通信的理想之选。


2、MQTT 功能概述
   MQTT基于发布和订阅模型,而非“客户端-服务器”模型,它具有两个功能实体——MQTT服务器和MQTT客户端。IoT网络上的任何“事物”,无论是硬件设备还是软件程序,都可以视为MQTT的客户端。所有的客户端并非直接向彼此发布或订阅消息,而是向MQTT服务器所管理的“主题”来发布或订阅消息。“主题”可理解为电子邮件的收件箱;客户端向主题发布消息,订阅该主题的其他客户端都将收到该消息。MQTT服务器负责接收所有已发布的消息,并需要确保将其传输到所有订阅的客户端。消息根据多个商定的QoS级别进行发布。服务器还将对网络上的所有IoT设备进行验证。
  
BC26模块:



  BC26 AT阿里云MQTT 核心指令
  1. AT+CGPADDR=1
  2. +CGPADDR: 1,100.91.141.117

  3. OK
  4. AT+QMTCFG="ALIAUTH",0,"a18dtRetCT0","BC26TEST","2oBrMJHjTlHbi8V1uoRGQZcC2SlKBXHE"
  5. OK
  6. AT+QMTOPEN=0,"iot-as-mqtt.cn-shanghai.aliyuncs.com",1883
  7. OK

  8. +QMTOPEN: 0,0
  9. AT+QMTCONN=0,"BC26TEST"
  10. OK

  11. +QMTCONN: 0,0,0
  12. AT+QMTSUB=0,1,"/a18dtRetCT0/BC26TEST/user/get",0
  13. OK

  14. +QMTSUB: 0,1,0,1
  15. AT+QMTPUB=0,1,1,0,"/sys/a18dtRetCT0/BC26TEST/thing/event/property/post","{params:{IndoorTemperature:58.8}}"
  16. OK

  17. +QMTPUB: 0,1,0
         
一,在阿里云物联网平台新建产品和添加设备
   阿里物联网平台连接https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fiot.console.aliyun.com%2Fdevices&lang=zh
   在后面接入设备时需要用到三要素:ProductKey,DeviceName,DeviceSecret
   ProductKey会在新建产品时生成,DeviceName可以自己定义,应该是只支持英文和数字,DeviceSecret会在添加设备完成后自动生成。

  
二,设计产品上传数据结构

三 STM32 BC26 MQTT核心代码
  1. #include "bc26.h"
  2. #include "string.h"
  3. #include "usart.h"
  4. #include "wdg.h"
  5. #include "led.h"
  6. char *strx,*extstrx;
  7. extern unsigned char  RxBuffer[255],RxCounter;
  8. BC26 BC26_Status;

  9. #define ProductKey     "a1dxl58BsE6"             //²úÆ·KEY
  10. #define DeviceName          "m001"      //
  11. #define DeviceSecret    "b9c04a0d041aa2eb8f2e5fd437ae7fd5"  //
  12. #define PubTopic         "/sys/a1dxl58BsE6/m001/thing/event/property/post"//·¢²¼Ö÷Ìâ
  13. #define SubTopic        "/sys/a1NXoxeFw4c/mzh002/thing/service/property/set"//¶©ÔÄÖ÷Ìâ
  14. void Clear_Buffer(void)//Çå¿Õ»º´æ
  15. {
  16.                 u8 i;
  17.                 Uart1_SendStr((char*)RxBuffer);
  18.                 for(i=0;i<100;i++)
  19.                 RxBuffer[i]=0;//»º´æ
  20.                 RxCounter=0;
  21.                 IWDG_Feed();//ι¹·
  22.        
  23. }
  24. void BC26_Init(void)
  25. {
  26.     printf("AT\r\n");
  27.     delay_ms(300);
  28.     strx=strstr((const char*)RxBuffer,(const char*)"OK");//·µ»ØOK
  29.     Clear_Buffer();       
  30.     while(strx==NULL)
  31.     {
  32.         Clear_Buffer();       
  33.         printf("AT\r\n");
  34.         delay_ms(300);
  35.         strx=strstr((const char*)RxBuffer,(const char*)"OK");//·µ»ØOK
  36.     }
  37.     printf("AT+CFUN=1\r\n");//»ñÈ¡¿¨ºÅ£¬ÀàËÆÊÇ·ñ´æÔÚ¿¨µÄÒâ˼£¬±È½ÏÖØÒª¡£
  38.     delay_ms(300);
  39.     printf("AT+CIMI\r\n");//»ñÈ¡¿¨ºÅ£¬ÀàËÆÊÇ·ñ´æÔÚ¿¨µÄÒâ˼£¬±È½ÏÖØÒª¡£
  40.     delay_ms(300);
  41.     strx=strstr((const char*)RxBuffer,(const char*)"460");//·µ460£¬±íÃ÷ʶ±ðµ½¿¨ÁË
  42.     Clear_Buffer();       
  43.     while(strx==NULL)
  44.     {
  45.         Clear_Buffer();       
  46.         printf("AT+CIMI\r\n");//»ñÈ¡¿¨ºÅ£¬ÀàËÆÊÇ·ñ´æÔÚ¿¨µÄÒâ˼£¬±È½ÏÖØÒª¡£
  47.         delay_ms(300);
  48.         strx=strstr((const char*)RxBuffer,(const char*)"460");//·µ»ØOK,˵Ã÷¿¨ÊÇ´æÔÚµÄ
  49.     }
  50.         printf("AT+CGATT=1\r\n");//¼¤»îÍøÂ磬PDP
  51.         delay_ms(300);
  52.         strx=strstr((const char*)RxBuffer,(const char*)"OK");//·µOK
  53.         Clear_Buffer();       
  54.         printf("AT+CGATT?\r\n");//²éѯ¼¤»î״̬
  55.         delay_ms(300);
  56.         strx=strstr((const char*)RxBuffer,(const char*)"+CGATT: 1");//·µ1
  57.         Clear_Buffer();       
  58.                 while(strx==NULL)
  59.                 {
  60.             Clear_Buffer();       
  61.             printf("AT+CGATT?\r\n");//»ñÈ¡¼¤»î״̬
  62.             delay_ms(300);
  63.             strx=strstr((const char*)RxBuffer,(const char*)"+CGATT: 1");//·µ»Ø1,±íÃ÷×¢Íø³É¹¦
  64.                 }
  65.                 printf("AT+CESQ\r\n");//²é¿´»ñÈ¡CSQÖµ
  66.         delay_ms(300);
  67.         strx=strstr((const char*)RxBuffer,(const char*)"+CESQ");//·µ»ØCSQ
  68.                 if(strx)
  69.                         {
  70.                                 BC26_Status.CSQ=(strx[7]-0x30)*10+(strx[8]-0x30);//»ñÈ¡CSQ
  71.                                 if((BC26_Status.CSQ==99)||((strx[7]-0x30)==0))//˵Ã÷É¨ÍøÊ§°Ü
  72.                                 {
  73.                                         while(1)
  74.                                         {
  75.             BC26_Status.netstatus=0;
  76.                                                 Uart1_SendStr("ÐźÅËÑË÷ʧ°Ü£¬Çë²é¿´Ô­Òò!\r\n");
  77.                                                 delay_ms(300);//ûÓÐÐźž͸´Î»
  78.                         
  79.                                         }
  80.                                 }
  81.              else
  82.              {
  83.                  BC26_Status.netstatus=1;
  84.               }
  85.                
  86.             }
  87.               Clear_Buffer();       
  88. }




  89. void BC26_ConTCP(void)
  90. {
  91.         printf("AT+QICLOSE=0\r\n");//¹Ø±ÕsocektÁ¬½Ó
  92.         delay_ms(300);
  93.     Clear_Buffer();
  94.     IWDG_Feed();//ι¹·
  95. }
  96. void BC26_CreateTCPSokcet(void)//´´½¨sokcet
  97. {

  98.     printf("AT+QIOPEN=1,0,"TCP","47.99.80.89",14269,1234,1\r\n");//´´½¨Á¬½ÓTCP,ÊäÈëIPÒÔ¼°·þÎñÆ÷¶Ë¿ÚºÅÂë ,²ÉÓÃÖ±½ÓͳöµÄ·½Ê½
  99.     delay_ms(300);
  100.     strx=strstr((const char*)RxBuffer,(const char*)"+QIOPEN: 0,0");//¼ì²éÊÇ·ñµÇ½³É¹¦
  101.         while(strx==NULL)
  102.                 {
  103.             strx=strstr((const char*)RxBuffer,(const char*)"+QIOPEN: 0,0");//¼ì²éÊÇ·ñµÇ½³É¹¦
  104.             delay_ms(100);
  105.                 }  
  106.      Clear_Buffer();       
  107.    
  108. }
  109. void BC26_Senddata(uint8_t *len,uint8_t *data)//×Ö·û´®ÐÎʽ
  110. {
  111.     printf("AT+QSOSEND=0,%s,%s\r\n",len,data);
  112. }

  113. void BC26_Senddatahex(uint8_t *len,uint8_t *data)//·¢ËÍÊ®Áù½øÖÆÊý¾Ý
  114. {
  115.     printf("AT+QISENDEX=0,%s,%s\r\n",len,data);
  116.         delay_ms(300);
  117.         while(strx==NULL)
  118.                 {
  119.             strx=strstr((const char*)RxBuffer,(const char*)"SEND OK");//¼ì²éÊÇ·ñ·¢Ëͳɹ¦
  120.             delay_ms(100);
  121.                 }  
  122.      Clear_Buffer();       
  123. }

  124. void BC26_RECData(void)
  125. {

  126.   
  127. }



  128. void  MQTT_Init(void)
  129. {
  130.   
  131.     printf("AT+QMTCFG="aliauth",0,"%s","%s","%s"\r\n",ProductKey,DeviceName,DeviceSecret);
  132.     delay_ms(300);
  133.     printf("AT+QMTOPEN=0,"139.196.135.135",1883\r\n");//ͨ¹ýTCP·½Ê½È¥Á¬½ÓMQTT°¢ÀïÔÆ·þÎñÆ÷
  134.     delay_ms(300);
  135.     strx=strstr((const char*)RxBuffer,(const char*)"+QMTOPEN: 0,0");//¿´Ï·µ»Ø×´Ì¬
  136.   while(strx==NULL)
  137.     {
  138.       strx=strstr((const char*)RxBuffer,(const char*)"+QMTOPEN: 0,0");//È·ÈÏ·µ»ØÖµÕýÈ·
  139.     }
  140.     Clear_Buffer();
  141.    printf("AT+QMTCONN=0,"clientExample_1987"\r\n");//È¥µÇ¼MQTT·þÎñÆ÷
  142.     delay_ms(300);
  143.     strx=strstr((const char*)RxBuffer,(const char*)"+QMTCONN: 0,0,0");//¿´Ï·µ»Ø×´Ì¬
  144.   while(strx==NULL)
  145.     {
  146.         strx=strstr((const char*)RxBuffer,(const char*)"+QMTCONN: 0,0,0");//¿´Ï·µ»Ø×´Ì¬
  147.     }
  148.     Clear_Buffer();
  149.     /*
  150.     printf("AT+QMTSUB=0,1,"mzh_m26",0\r\n");//¶©ÔĸöÖ÷Ìâ
  151.         delay_ms(500);
  152.     strx=strstr((const char*)RxBuffer,(const char*)"+QMTSUB: 0,1,0,0");//¶©Ôijɹ¦
  153.   while(strx==NULL)
  154.     {
  155.         strx=strstr((const char*)RxBuffer,(const char*)"+QMTSUB: 0,1,0,0");//¶©Ôijɹ¦
  156.     }
  157.     Clear_Buffer();
  158.     */
  159. }

  160. void aliyunMQTT_PUBdata(u8 temp,u8 humi)
  161. {
  162.      u8 t_payload[200],len;
  163.      printf("AT+QMTPUB=0,0,0,0,%s\r\n",PubTopic);//·¢²¼Ö÷Ìâ
  164.      delay_ms(300);
  165.      len=Mqttaliyun_Savedata(t_payload,temp,humi);
  166.      t_payload[len]=0;
  167.      printf("%s",t_payload);
  168.   while((USART2->SR&0X40)==0){}//Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï   
  169.      USART2->DR = (u8) 0x1A;   
  170.      delay_ms(100);
  171.      strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,0,0");//¿´Ï·µ»Ø×´Ì¬
  172.   while(strx==NULL)
  173.     {
  174.         strx=strstr((const char*)RxBuffer,(const char*)"+QMTPUB: 0,0,0");//¿´Ï·µ»Ø×´Ì¬
  175.     }
  176.     Clear_Buffer();
  177. }

  178. //·ÃÎʰ¢ÀïÔÆÐèÒªÌá½»JSONÊý¾Ý
  179. u8 Mqttaliyun_Savedata(u8 *t_payload,u8 temp,u8 humi)
  180. {

  181.     char json[]="{"id":"26","version":"1.0","params":{"CurrentTemperature":{"value":%d},"CurrentHumidity":{"value":%d}},"method":"thing.event.property.post"}";         //     char json[]="{"datastreams":[{"id":"location","datapoints":[{"value":{"lon":%2.6f,"lat":%2.6f}}]}]}";
  182.     char t_json[200];
  183.     unsigned short json_len;
  184.     sprintf(t_json, json, temp, humi);
  185.     json_len = strlen(t_json)/sizeof(char);
  186.           memcpy(t_payload, t_json, json_len);
  187.     return json_len;
  188. }





MQTT把数据传送到阿里云



代码见附件

MQTT 协议 3.1.1 中文版
  



本帖子中包含更多资源

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

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

104

主题

191

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部