12-MQTT介绍

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

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

就变成了

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

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

然后在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,后期如果真的需要研究了,再研究

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ytkah

如何调用finecms指定栏目的描述关键词

  有时我们在用finecms建站时需要调用指定栏目的描述和关键词,实现个性化需求,比如id为23的栏目很重要,要让它在首页展示出来,这时我们要如何调用呢?{d...

28350
来自专栏WeTest质量开放平台团队的专栏

【腾讯内部干货分享】安卓包体压缩——分析Dalvik字节码进行减包优化

对游戏整体的压缩却不影响场景,对图片的压缩却不影响品质。最麻烦的是对代码进行压缩,简直是让程序们熬白了头发只为包体再小个几K。

27250
来自专栏企鹅号快讯

ForeSpider教程连载之链接抽取

自从来到前嗅,小编从一个爬虫小白到现在能够熟练的采集各种网站各种数据真的是有很大的成长,当然,成长过程中肯定少不了踩坑(很多网站都有防爬措施),为了让各位用户能...

23770
来自专栏java一日一条

写给精明Java开发者的测试技巧

我们都会为我们的代码编写测试,不是吗?毫无疑问,我知道这个问题的答案可能会从 “当然,但你知道怎样才能避免写测试吗?” 到 “必须的!我爱测试”都有。接下来我会...

10110
来自专栏企鹅号快讯

Python循环控制之for

各位小伙伴们 大家周三愉快 今天我们要来共同探讨 另外一个在Python中 (严格的说实在所有语言中) 最重要的语句之一 For()循环控制语句 技术要点: f...

22760
来自专栏撸码那些事

【封装那些事】不充分的封装

13420
来自专栏码洞

全栈虚拟机GraalVM初体验

近日Oracle开源了一个实验性的产品GraalVM,官方称之为Universal GraalVM。它打通了不同语言之间的鸿沟,让我们可以进行混合式多语言编程。...

22220
来自专栏Java技术栈

Java序列化技术即将被废除!!!

18130
来自专栏Pythonista

Python之路,Day1 - Python基础1

python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解...

20420
来自专栏Crossin的编程教室

【Git 第63课】python 2到3的新手坑

昨天挖了个坑,论坛上已经有不少解答了,还有c语言的版本。今天先不填坑,让题目再飞一会儿,没做的同学可以周末试着写写玩儿。 周三的时候去参加“编程一小时”活动,过...

34470

扫码关注云+社区

领取腾讯云代金券