单片机发mqtt消息_stm32 单片机可以接收和发送mqtt消息不 - CSDN
精华内容
参与话题
  • 基于4G模块的MQTT实现

    2020-07-30 23:31:57
    基于stm32f10系列mcu+sim900 4G模块 通过开源的MQTT代码(可自行到github或开源官网下载)实现的终端到服务的MQTT协议通信 代码简单 实现了订阅、发布等相关功能,可以简单发送消息,亦可传输文件;
  • MQTT是基于发布/订阅范式的消息协议。你发布了一个Topic,只要别人订阅了这个Topic,那么他就能收到信息。同样你要收到别人发布的消息,首先你要订阅别人。(就好比抖音你关注了某个人,当这个人发布视频的时候,...

    材料:

    1. 51单片机
    2. ESP8266-01S
    3. ESP LINK烧写器(USB-TTL也可以)
    4. 杜邦线若干

    MQTT简述:

    MQTT是基于发布/订阅范式的消息协议。你发布了一个Topic,只要别人订阅了这个Topic,那么他就能收到信息。同样你要收到别人发布的消息,首先你要订阅别人。(就好比抖音你关注了某个人,当这个人发布视频的时候,系统就会通知你)。假如说好几个人都订阅了一个Topic,那么这几个人都将收到信息。

    MQTT的14种报文:

    在这里插入图片描述
    具体报文格式请参考设备终端接入协议-MQTT,仔阅读你可以从中发现每一个字节所代表的含义。

    ESP8266刷AT指令:

    AT指令集下载,选择ESP8266 Non-os SDK AT指令集合。

    1. 将ESP8266插入ESP LINK烧写器,并将烧写器插在电脑上。

    2. 初始波特率为115200,选择115200打开串口。

    3. 勾选发送新行,HEX发送不勾选。

    4. 发送AT,返回OK,表明指令运行正常。

    5. ESP8266有三种工作模式:

      1. SoftAP模式(相当于热点或者路由器,用手机可以连接)
      2. Station模式(客户端模式,用来连接服务端的模式)
      3. Station+SoftAP模式(以上两种共存)
    6. 设置为 Station+SoftAP模式并保存到Flash中(下次上电不用在设置),发送AT+CWMODE_DEF=3,返回ok。

    7. 连接WIFI,并保存到Flash中,发送AT+CWJAP_DEF="TP-LINK_1696","123456789",返回WIFI CONNECTED
      WIFI GOT IP

      OK,此时,已经连接上你家的路由器。

    8. 连接远程服务器并保存到Flash,发送AT+SAVETRANSLINK=1,"183.230.40.39",6002,"TCP",返回ok,此时已经连接上OneNet的MQTT服务器,并且开启开机透传模式。

    9. 完成以上步骤只要ESP8266上电就会连接上该路由器和OneNet的MQTT服务器。
      10.实例图:
      在这里插入图片描述

    设备连接OneNet:

    说明:了解报文的话可直接跳到第21条。

    1. 发送 CONNECT报文进行连接,选择选择HEX发送,我的设备报文如下,每个产品ID,Master-Apikey,设备ID不同所以报文不同。

    2. 10 3B 00 04 4D 51 54 54 04 C2 00 78 00 09 35 33 36 35 32 33 34 30 37 00 06 32 36 32 36 38 35 00 1C 48 45 34 4C 43 73 49 73 59 78 46 37 57 6B 44 50 54 54 54 34 75 61 37 69 73 66 77 3D

    3. 第1个字节10,二进制形式为00010000高4位代表MQTT Packet Type,也就是值为1的报文,查上面的报文表你会发现这是CONNECT报文,

    4. 第2个字节3B表示 remainedLength也就是后面的信息还有多长,3B转化成十进制为59,不信你可以数一数,3B之后确实是59个字节。

    5. 第3-4字节代表所使用的协议名字的长度,00 04也就是占用4个字节。

    6. 那么后面的四个字节4D 51 54 54就是协议的名字了,查一下ASCII码表,你会发现0x4D对应的字母就是M,四个字节对应的单词就是MQTT,也就是我们所使用的协议。

    7. 第9个字节04代表该协议的版本号是4.

    8. 第10个自己字节C2代表userFlag=1 passwordFlag=1 willFlag=0 willRetainFlag=0 willQosFlag=0 clenSessionFlag=1 clenSessionFlag=0详情请查看上面的连接文档。

    9. 第11-12字节00 78装化成十进制就是120,意思就是 keepAlive=120,也就是每隔120s保活一次。不然你的设备会掉线。

    10. 第13-14字节00 09代表你后面的设备ID占用9个字节。

    11. 那么接下来的9个字节就是我的设备ID了,这里就不翻译出来了。

    12. 第24-25字节00 06代表后面你的产品ID占用6个字节。

    13. 显然这后面6个字节就是产品ID。

    14. 在后面两个字节00 1C代表Master-Apikey长度,也就是28个字节。

    15. 后面的28个字节就是Master-Apikey,我做了更改(哈哈)。总共61个字节。

    16. 发送这个报文,之后你就会看到OneNet平台上相应的设备已经在线。
      在这里插入图片描述

    17. 订阅一个名字为Topic1的TOPIC,发送82 0B 00 02 00 06 54 6F 70 69 63 31 00可以自行进行解释。

    18. 发布一个名字为Topic2,内容为1的TOPIC,发送30 09 00 06 54 6F 70 69 63 32 31可以自行解释。

    19. 保活,发送C0 00,意思就是客户端发送PING(连接保活)命令。

    20. 此时,你可以用模拟器发布或订阅测试一下,串口会收到相应的信息。或者使用平台下发命令。

    21. 报文这么难搞,太费劲,可以去这里下载Mqtt-device,可以自动生成相应的报文。实例图:
      在这里插入图片描述

    22. 此时,逻辑上已经完工了,51单片机和esp8266使用串口进行通信,51在编写程序的时候只需要把报文写死就可以了,需要动态更改的报文可以按照报文格式拼接成一个报文。这样就能发布消息了;加个中断程序可以实现从ESP8266中读取消息。这样就能实现双向通信了。除此之外,要有一个定时器,到一定时间需要保活一下(keepalive),不然设备就掉线了。

    23. 会使用SDK开发的推荐使用官方的MQTT_SDK

    24. 下次写博客提供51程序,一样可以使用上个博客提供的Android应用控制51,需要做发布和订阅更改。

    25. 注:当前波特率为115200,当使用单片机的时候波特率要和单片机一致。可以用AT指令调节ESP8266的波特率。例如:AT+UART=9600,8,1,0,0,将波特率改为9600。

    展开全文
  • STM32F407单片机 安信可A9 GPRS 模块 流程 1.建立连接 需要按照如下流程发送: AT+CGATT=1 //附着网络 OK AT+CGDCONT=1,"IP","CMNET" //设置PDP参数 OK AT+CGACT=1,1 //激活PDP,正确激活以后就可以上网了 ...

    硬件设备

    1. STM32F407单片机
    2. 安信可A9 GPRS 模块

    流程

    1.建立连接

    需要按照如下流程发送:

     AT+CGATT=1          //附着网络
     OK                 
    
     AT+CGDCONT=1,"IP","CMNET" //设置PDP参数
     OK
    
     AT+CGACT=1,1 //激活PDP,正确激活以后就可以上网了
     OK
    
    AT+MQTTCONN="114.129.24.41",1883,"TEST",60,1,"LF","LF" //参数分别是: ip, 端口, clientid, keepalive时间,clearssion, 用户名,密码
     OK
    

    注意:上述AT命令第二行的"OK"是GPRS模块正确接收单片机执行回复的字符串,下同。

    2.订阅数据

    AT+MQTTSUB="subtopic",1,0  //主题名,订阅或取消订阅,qos
    OK
    

    订阅成功后,服务器pub的消息会被GPRS模块收到,也就是单片机的串口会收到如下格式数据

    +MQTTPUBLISH:消息id,topic名称,载荷长度,载荷信息
    如下:

    
    // 消息id:不断累加,
    +MQTTPUBLISH:4,subtopic2,140,{
      "lcdDisString" : "wo shi ceshi de gongju  ",
      "relayState" : "open",
      "tempDangerVal" : 56,
      "ledState" : "open",
      "motorPwm" : 76
    }
    

    3.发布数据

    单片机可主动上报信息,具体如下:

    AT+MQTTPUB="pubtopic","i am payload",0,0,0    //topic名称,载荷数据,qos,重发标志,是否保留?
    OK
    

    实际通信中,Pub数据如下,

    1. topic 改为 IN/ECHO/1536558114123/1536558584545/1536728657044
    2. "i am payload"改为具体设备载荷数据,暂定格式如下

    与服务器通信的载荷JSON方式封包,原数据格式如下:

    {
        "deviceId": "F62802BFC2315E",
        "data": {
            "gpsData": {
                "gps": {
                    "GPS_Longitude": 0,
                    "GPS_Latitude": 0
                },
                "agps": {
                    "AGPS_Longitude0": 0,
                    "AGPS_Latitude0": 0
                }
            },
            "PH": 0,
            "Conductivity": 0,
            "ORP": 0,
            "Turbidity": 0,
            "O2": 0,
            "voltage": {
                "BatVoltage": 3.911444,
                "SolarVoltage": 0.59391,
                "SensorVoltage": 11.42429
            }
        }
    }
    

    考虑到8位单片机在进行JSON解包时,内存不够(32位单片机没有问题),因此将其简化,具体为:

    {
        "deviceId": "F62802BFC2315E",
        "data": "GPS_Longitude=0.000000,GPS_Latitude=0.000000,AGPS_Longitude=0.000000,AGPS_Latitude=0.000000,PH=0.000000,Conductivity=0.000000,ORP=0.000000,Turbidity=0.000000,O2=0.000000,BatVoltage=3.911444,SolarVoltage=0.593910,SensorVoltage=11.424290"
    }
    

    也就是单片机向GPRS发送下列字符串即可上报:

    AT+MQTTPUB="/World",{"deviceId": "F62802BFC2315E","data": "GPS_Longitude=0.000000,GPS_Latitude=0.000000,AGPS_Longitude=0.000000,AGPS_Latitude=0.000000,PH=0.000000,Conductivity=0.000000,ORP=0.000000,Turbidity=0.000000,O2=0.000000,BatVoltage=3.911444,SolarVoltage=0.593910,SensorVoltage=11.424290"},0,0,0
    

    注意:

    1. 在实际使用过程中,上述字符串通过sprintf函数将具体的变量值打印到字符串中,
    2. 单片机在每个双引号前要加转义字符“\” ,上述为了演示没有加。
    3. java服务器在接收到单片机pub的数据后要去掉引号前面多余的转义字符符号,
    String payload = message.getPayload().toString().replace('\\',' ');
    System.out.println(payload);
    

    4.断开链接

    如果要节省电量,可在休眠时断开与服务器的连接,如下:

    AT_MQTTDISCONN
    OK
    
    展开全文
  • 单片机MQTT实现推送简单使用

    万次阅读 2018-03-09 16:50:18
    a)硬件:ATMEGA644PA 8位单片机 ENC28J60 b)下载MQTT c语言的包: C/C++ MQTT Embedded clients https://www.eclipse.org/paho/clients/c/embedded/ c)MQTT基础知识 http://mqtt.org/ http://download....

    1、准备条件:
    a)硬件:ATMEGA644PA 8位单片机 ENC28J60
    b)下载MQTT c语言的包:
    C/C++ MQTT Embedded clients
    https://www.eclipse.org/paho/clients/c/embedded/
    c)MQTT基础知识
    http://mqtt.org/
    http://download.csdn.net/detail/zhou6343178/9495445

    2、移植MQTTPacket到项目里:
    复制文件夹MQTTPacket到工程,复制MQTTPacket\samples里面的transport.c、transport.h到工程
    这里写图片描述

    3、修改已经transport.c里面的四个接口:

    int transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen);
    int transport_getdata(unsigned char* buf, int count);
    int transport_open(char* host, int port);
    int transport_close(int sock);

    看接口名称就知道,该四个接口实现的是TCP数据的收发,具体修改需要根据已经实现的TCP接口来定。(单片机上常用的TCP/IP协议栈主要有uip、LwIP)
    注意:MQTT是tcp/ip的应用层,传输层需要自己实现,这四个接口分别对应TCP的连接、收、发和关闭。

    4、实现订阅/发布,查看MQTTPacket\samples下的pub0sub1.c。
    下面为参数的意义:
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer; //连接参数
    data.clientID.cstring = “me2”; //客户ID,唯一
    data.keepAliveInterval = 200; //保存存活时间200s
    data.cleansession = 1;//重新连接后是否清除以前的信息 0表示不清除,1表示重连清除
    data.username.cstring = “admin”;//如果服务器需要用户名密码,这里设置
    data.password.cstring = “admin”;
    Qos :
    0 表示最多一次
    1 表示至少一次
    2 表示只有一次

    MQTTDeserialize_publish(&dup,&qos,&retained,&msgid,&receivedTopic,&payload_in, &payloadlen_in, buf,buflen);

    msgid:该包的ID,paketid,如果需要增加反馈(QoS为1和2需要反馈),需要获取该ID

    发送反馈:

    MQTTDeserialize_publish(&dup, &qos, &retained, &msgid,&receivedTopic,&payload_in, &payloadlen_in, buf, buflen);
    int len = MQTTSerialize_puback(buf,buflen,msgid);
    transport_sendPacketBuffer(ack_buf,len);

    接收服务器的反馈:

    if(PUBACK == MQTTPacket_read(buf,buflen,transport_getdata))
    {
        unsigned char packettype = 0;
        unsigned char dup_ack = 0;
        unsigned short packetid = 0;
    
        MQTTDeserialize_ack(&packettype,&dup_ack,&packetid,buf,buflen);
    }

    比较发送的msgid和反馈获取的packetid,如果一致表示该包发送成功。
    等等,具体看文档

    5、服务器实现 mosquitto
    请参考:http://blog.csdn.net/xukai871105/article/details/39252653
    指令举例:
    订阅 mosquitto_sub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic
    -h 服务器域名
    -u 用户名(没有可以省略)
    -P密码(没有可以省略)
    -t topic名称

    发布:mosquitto_pub -h xxx.xxx.xxx.xxx -u admin -P admin -t substopic -m hello
    -m 发布的内容

    以上基本实现单片机与服务器的联调。如果需要手机控制单片机,可下载手机相关的MQTT包进行通讯。

    =====更新(2018-03-09)======
    很高兴这篇笔记能给有些人带来帮助,我把使用实例上传到 GitHub,其中有些对 MQTT 的改动,供大家参考。

    展开全文
  • mqtt资料加源码stm32单片机+TCP,客户端应用。送给需要的人
  • 单片机运行的程序功能:通过单片机采集DS18B20温度,通过AT指令控制ESP8266 01 设置透传模式,单片机运行MQTT协议,连接到EMQ等标准MQTT服务,手机APP端完成温度采集、继电器控制。 手机APP功能:手机app运行的是...

    MQTT 与 Socket 区别:

    通俗来讲:mqtt是对socket进一步封装。稳定性更好,消耗流量更小,连接更加安全, 大公司物联网目前主流使用的传输协议是MQTT。

    单片机型号:STM32F103C8T6

    单片机运行的程序功能:通过单片机采集DS18B20温度,通过AT指令控制ESP8266 01 设置透传模式,单片机运行MQTT协议,连接到EMQ等标准MQTT服务,手机APP端完成温度采集、继电器控制。

    手机APP功能:手机app运行的是MQTT协议,作为客户端,连接EMQ, 可以设置MQTT参数配置、远程采集温度、控制继电器。
    在这里插入图片描述

    资料:
    在这里插入图片描述

    此外提供公共EMQ服务使用,EMQ百万级别的mqtt连接承载力,配置简单,自己也可以买一台服务器配置

    在这里插入图片描述

    展开全文
  • 链接--->... 1、准备条件:a)硬件:ATMEGA644PA 8位单片机 ENC28J60b)下载MQTTC语言的包:C/C++ MQTT Embedded clientshttps://www.eclipse.org/paho/clients/c/embedded/...
  •   做了一个阿里云MQTT单片机编程小工具,点击测试http://www.norra.cn:9091/  传感云是采集、传输、存储、可视化、接口、APP、微信一体的传感器与应用服务平台,支持多种模式平台私有化部署。传感云强大的硬件...
  • MQTT单片机编程小工具(阿里云LinkDevelop_V1.0.0),该工具能更好的方便熟悉MQTT连接阿里云服务器
  • java用mqtt收发消息

    万次阅读 2015-04-17 10:09:35
    import org.eclipse.paho.client.mqttv3.MqttCallback;...import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.Mq
  • GPRS MQTT STM32

    2020-07-30 23:31:50
    GPRS MQTT STM32
  • 本章主要介绍物联网平台中相关的产品名词。明白名词说的是啥。两眼不慌慌。看看官方文档吧 concent 报文连接服务器 PUB 发布 SUB 订阅 PING PONG Disconcent 断开连接 unsub 取消订阅  ...
  • MQTT单片机编程工具(阿里云LinkDevelop),模拟阿里云中的硬件设备,和云端进行通信,将三元组复制进去,点击生成基本信息,就可以自动生成Mqtt客户端连接阿里云需要的参数。
  • 可以通过阿里云 IOT 三元组生成 MQTT 用户名 密码等,十分方便,阿里云物联网开发利器。
  • 可以通过阿里云 IOT 三元组生成 MQTT 用户名 密码等,十分方便,阿里云物联网开发利器。
  • 主要针对阿里云的阿link 协议能够快速生成相关信息的一款工具
  • 现在到像是过气的网红,今天咱就说说基于TCP的MQTT到底是个啥,当初听到MQTT觉得很高大上的样子,各种专业名词,发布订阅代理甩一脸,虽然有了吹嘘的资本,但是一直没有理解MQTT到底是什么,单片机开发人员都喜欢...
  • nodeMCU和arduino串口透传MQTT消息

    千次阅读 2017-10-19 00:53:58
    nodeMCU 和 arduino 串口 透传 MQTT 消息
  • 基于MQTT通信协议 实现单片机与腾讯云IOT|阿里云IOT|中国移动ONENET的对接。 在实际调试时选择STM32F103C8T6与ESP826601S的开发板,对接过程是一个比较艰难的过程。编译、烧录、下载 至单片机后通过串口调试助手能够...
1 2 3 4 5 ... 20
收藏数 914
精华内容 365
关键字:

单片机发mqtt消息