10-MQTT介绍

作者: 杨奉武 | 来源:发表于2018-11-16 00:39 被阅读12次

https://www.cnblogs.com/yangfengwu/p/9953920.html

看到这个项目第一想法肯定需要一个服务器,所有的wifi设备和手机都去连接这个服务器,然后服务器进行信息的中转

这个服务器呢第一种方式是自己开发

就变成了

其实MQTT的基本功能就是上面的

还要说一点MQTT实质上就是个TCP服务器

https://www.cnblogs.com/yangfengwu/p/9124299.html

然后在TCP的基础上封装了一套协议

只要大家的设备支持TCP,也就可以自己写封装函数,然后实现MQTT功能

现在说一下两个设备是如何通信的

假设设备1   先连接MQTT服务器  然后告诉MQTT服务器它接收标志是1111的消息

假设设备2   先连接MQTT服务器  然后告诉MQTT服务器它接收标志是2222的消息

然后设备1 , 发送消息的时候 , 消息的开头写上标志 2222 然后后面跟上数据,  服务器收到以后就转发给接收标志是2222的设备   ,这样设备2就接收到了设备1的数据

然后设备2 , 发送消息的时候 , 消息的开头写上标志 1111 然后后面跟上数据,  服务器收到以后就转发给接收标志是1111的设备   ,这样设备1就接收到了设备2的数据

其实具体的协议呢看下面,  这是我用单片机写的MQTT封包,就是在网络芯片实现TCP的基础上让芯片连接MQTT服务器,然后实现通信

/**

* @brief  连接服务器的打包函数

* @param 

* @retval

* @example

**/

char ConnectMqtt(char *ClientID,char *Username,char *Password)

{

    int ClientIDLen = strlen(ClientID);

    int UsernameLen    = strlen(Username);

    int PasswordLen = strlen(Password);

    int DataLen = 0;

    int Index = 2;

    int i = 0;

    DataLen = 12 + 2+2+ClientIDLen+UsernameLen+PasswordLen;

    MqttSendData[0] = 0x10;                //MQTT Message Type CONNECT

    MqttSendData[1] = DataLen;    //剩余长度(不包括固定头部)

    MqttSendData[Index++] = 0;        // Protocol Name Length MSB   

    MqttSendData[Index++] = 4;        // Protocol Name Length LSB   

    MqttSendData[Index++] = 'M';        // ASCII Code for M   

    MqttSendData[Index++] = 'Q';        // ASCII Code for Q   

    MqttSendData[Index++] = 'T';        // ASCII Code for T   

    MqttSendData[Index++] = 'T';        // ASCII Code for T   

    MqttSendData[Index++] = 4;        // MQTT Protocol version = 4   

    MqttSendData[Index++] = 0xc2;        // conn flags

    MqttSendData[Index++] = 0;        // Keep-alive Time Length MSB   

    MqttSendData[Index++] = 60;        // Keep-alive Time Length LSB  60S心跳包 

    MqttSendData[Index++] = (0xff00&ClientIDLen)>>8;// Client ID length MSB   

    MqttSendData[Index++] = 0xff&ClientIDLen;    // Client ID length LSB 

    for(i = 0; i < ClientIDLen; i++)

    {

        MqttSendData[Index + i] = ClientID[i];         

    }

    Index = Index + ClientIDLen;

    if(UsernameLen > 0)

    { 

        MqttSendData[Index++] = (0xff00&UsernameLen)>>8;//username length MSB   

        MqttSendData[Index++] = 0xff&UsernameLen;    //username length LSB   

        for(i = 0; i < UsernameLen ; i++)

        {

            MqttSendData[Index + i] = Username[i];   

        }

        Index = Index + UsernameLen;

    }

    if(PasswordLen > 0)

    {   

        MqttSendData[Index++] = (0xff00&PasswordLen)>>8;//password length MSB   

        MqttSendData[Index++] = 0xff&PasswordLen;    //password length LSB   

        for(i = 0; i < PasswordLen ; i++)

        {

            MqttSendData[Index + i] = Password[i];   

        }

        Index = Index + PasswordLen;

    }   

    return Index;

}

/**

* @brief  MQTT订阅/取消订阅数据打包函数

* @param  SendData

* @param  topic                主题

* @param  qos        消息等级

* @param  whether    订阅/取消订阅请求包

* @retval

* @example

**/

char MqttSubscribeTopic(char *topic,char qos,char whether)

{   

    Index = 0;

  i = 0;

    if(whether)

        MqttSendData[Index++] = 0x82;                        //0x82 //消息类型和标志 SUBSCRIBE 订阅

    else

        MqttSendData[Index++] = 0xA2;                        //0xA2 取消订阅

    MqttSendData[Index++] = strlen(topic) + 5;                //剩余长度(不包括固定头部)

    MqttSendData[Index++] = 0;                          //消息标识符,高位

    MqttSendData[Index++] = 0x01;                    //消息标识符,低位

    MqttSendData[Index++] = (0xff00&strlen(topic))>>8;    //主题长度(高位在前,低位在后)

    MqttSendData[Index++] = 0xff&strlen(topic);              //主题长度

    for (i = 0;i < strlen(topic); i++)

    {

        MqttSendData[Index + i] = topic[i];

    }

    Index = Index + strlen(topic);

    if(whether)

    {

        MqttSendData[Index] = qos;//QoS级别

        Index++;

    }

    return Index;

}

/**

* @brief  MQTT发布数据打包函数

* @param  mqtt_message

* @param  topic                主题

* @param  qos        消息等级

* @retval

* @example

**/

char MqttPublishData(char * topic, char * message,char length, char qos)

    char topic_length = strlen(topic);   

    char message_length = length;

    char i,index=0;   

    static char id=0;

    MqttSendData[index++] = 0x30;    // MQTT Message Type PUBLISH 

    if(qos)

        MqttSendData[index++] = 2 + topic_length + 2 + message_length;//数据长度

    else

        MqttSendData[index++] = 2 + topic_length + message_length;  // Remaining length 

    MqttSendData[index++] = (0xff00&topic_length)>>8;//主题长度

    MqttSendData[index++] = 0xff&topic_length;

    for(i = 0; i < topic_length; i++)

    {

        MqttSendData[index + i] = topic[i];//拷贝主题

    }

    index += topic_length;

    if(qos)

    {

        MqttSendData[index++] = (0xff00&id)>>8;

        MqttSendData[index++] = 0xff&id;

        id++;

    }

    for(i = 0; i < message_length; i++)

    {

        MqttSendData[index + i] = message[i];//拷贝数据

    }

    index += message_length;

    return index;

}

https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.8a931debd5LqD6&id=582060294154

当然啦,咱现在用的WIFI和GPRS里面已经写好了这种组合包,咱直接调用API就可以了

其实大家不需要去研究这个协议,最起码现在不需要,我只是让大家稍微了解下MQTT,后期如果真的需要研究了,再研究

也不迟,现在就是先学会用

https://www.cnblogs.com/yangfengwu/p/9955765.html

相关文章

  • 10-MQTT介绍

    https://www.cnblogs.com/yangfengwu/p/9953920.html 看到这个项目第...

  • Runtime介绍---术语介绍

    1. 什么是Runtime Runtime又叫运行时,是一套C语言的API。 我们平时编写的OC代码,底层都是基于...

  • 介绍

    万物终有一天会消失殆尽,诸神出卖黎明,光明为黑暗所湮灭,日月皆痕,海潮鸣泣,幼雏嚎啕,生灵涂炭。 托里奥世纪第20...

  • 介绍😊

    大家好,我是beth,初入简书,不邀自来,还请各位见谅! 先说说我是怎么想着来的吧?这不是刚过了一个寒假嘛...

  • 介绍

    在这个世界上还有三个家族他们不受各个国家联合国管。但他们身上有着使命分别是帝国家族曲国家族圣国家族。他们隐藏在一个...

  • 介绍

    云轩:主角,星罗帝国的二皇子。从小就不能练气,被人们称为废物。直到12岁的时候,自己的武魂觉醒才能练气,双...

  • 介绍

    万花阁 神秘至极的组织,亦正亦邪。万花阁的人行动隐秘,至今未被发现所在地。听说组成成员均以花来命名。所到之处,皆留...

  • 介绍

    此书命曰元.八洲传。属九洲四传第二部。第一部,上古往事。上古往事乃元八洲传外传。前两部为战胜心魔,而第三部,大梦...

  • 介绍

    千肆篇 7月的天气燥热,但在红杏阁里这份燥热就别有一番风味。漫天的胭脂水粉的香味变成了调味剂,女人们千姿百媚,在...

  • 介绍

    该文集属于收录文集,里面的内容不全是本人创作,有收录个人喜欢的内容。 *(偏个人向)

网友评论

    本文标题:10-MQTT介绍

    本文链接:https://www.haomeiwen.com/subject/jtcpfqtx.html