• MQTT--单片机实现即时通信


    链接--->http://blog.csdn.net/zhou6343178/article/details/51182623

    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到工程,复制MQTTPacketsamples里面的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);
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

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

    4、实现订阅/发布,查看MQTTPacketsamples下的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);
    • 1
    • 1

    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);
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    接收服务器的反馈:

    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);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    比较发送的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包进行通讯。

  • 相关阅读:
    栈和堆的区别【转】
    C++虚函数表解析(转)
    C++编码规范(转)
    全局变量的声明和定义 以及dll中全局变量的导出
    Sizeof与Strlen的区别与联系.
    利用事件对象实现线程同步
    创建互斥对象同步线程
    MFC GDI笔记 转
    ClientToScreen( )和ScreenToClient( )
    Visual C++线程同步技术剖析
  • 原文地址:https://www.cnblogs.com/dpf-learn/p/6623407.html
Copyright © 2020-2023  润新知