STM32 移植MQTT

stm32移植mqtt

  1. 下载MQTT的库:Paho https://github.com/eclipse/paho.mqtt.embedded-c

 

 

  • 将MQTTPacket\src目录下的文件添加到工程这里写图片描述
  • MQTTPacket\samples下的transport.c、transport.h添加到工程

    //接收数据,recv函数仅仅是copy数据,真正的接收数据是协议来完成的), recv函数返回其实际copy的字节数。
    int transport_getdata(unsigned char* buf, int count)
    {
        int rc = 0;
      u16 len = 0;
      u8 *data = 0;
        while(1)
        {
            if(UART7_RX_STA&0X8000)     //接收到一次数据了
            {
                memcpy(buf, (void*)&UART7_RX_BUF[read_buf_len], count);
                read_buf_len += count;          
                break;
            }
            delay_ms(10);
        }
        return count;
    }

在需要调用的地方实现订阅发布和读取订阅。

     //打开网络连接
    mysock = transport_open(host, port);
    if(mysock < 0)
        return mysock;
    printf("Sending to hostname %s port %d\n", host, port);
//现在将连接字符串格式化一下,现在还没有发送
    len = MQTTSerialize_connect(buf, buflen, &data);
    printf("%s",buf);
    //现在是数据的发送
    rc = transport_sendPacketBuffer(mysock, buf, len);
    /* 等待connack *///发送后接收服务器返回的数据,这里使用了一个函数的指针,要定义这个指针
    if (MQTTPacket_read(buf, buflen, transport_getdata) == CONNACK)//CONNACK – 确认连接请求
    {
        unsigned char sessionPresent, connack_rc
        if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)
        {
            printf("Unable to connect, return code %d\n", connack_rc);
            goto exit;
        }
    }
    else
        goto exit;
    /* 订阅 */
    topicString.cstring = "substopic";
    len = MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos);
    rc = transport_sendPacketBuffer(mysock, buf, len);
    //等待服务器答复
    //SUBACK 订阅确认 报文包含一个返回码清单, 它们指定了 SUBSCRIBE 请求的每个订阅被授予的最大 QoS 等级。
    if (MQTTPacket_read(buf, buflen, transport_getdata) == SUBACK)  /* 等待 suback */
    {
        unsigned short submsgid;
        int subcount;
        int granted_qos;
        rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen);
        if (granted_qos != 0)
        {
            printf("granted qos != 0, %d\n", granted_qos);
            goto exit;
        }
    }
    else
        goto exit;
    /* 循环获取消息 on subscribed topic */
//  topicString.cstring = "pubtopic";
//  while (1)
    {
        /* transport_getdata() has a built-in 1 second timeout,
        your mileage will vary */
        if (MQTTPacket_read(buf, buflen, transport_getdata) == PUBLISH)//qos 响应报文,当qos>0时才有响应
        {
            unsigned char dup;
            int qos;
            unsigned char retained;
            unsigned short msgid;
            int payloadlen_in;
            unsigned char* payload_in;
            int rc;
            MQTTString receivedTopic;
            rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,
                    &payload_in, &payloadlen_in, buf, buflen);
            printf("message arrived %.*s\n", payloadlen_in, payload_in); //消息到达
        }
        printf("publishing reading\n");//读取发布
     //下面两行是用来发布消息。这里发布,上面订阅,就形成了一个循环。
        len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, (unsigned char*)payload, payloadlen);
        rc = transport_sendPacketBuffer(mysock, buf, len);
        delay_ms(1000);
    }
    while(1)
    {
        len = MQTTSerialize_pingreq(buf, buflen);//发送心跳
        rc = transport_sendPacketBuffer(mysock, buf, len);//发送
        delay_s(55);
        printf("心跳");
    }
exit:
    transport_close(mysock);

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要了解MQTT是什么。MQTT是一种轻量级的即时通讯协议,它被设计用于在低带宽和不稳定的网络环境中传输消息。而STM32是一种32位的微控制器,具有较高的计算和通信能力。 要在STM32移植MQTT,需要完成以下几个步骤: 1. 硬件支持:确保STM32芯片具有与MQTT协议相关的硬件功能,例如串口通信、网络接口等。如果芯片不支持这些硬件功能,可能需要通过外部组件进行扩展,以满足MQTT的通信要求。 2. 选择MQTT库:选择适合STM32平台的MQTT库,并将其添加到项目中。常见的MQTT库包括Paho MQTT、emMQTT等。选择合适的库取决于需求和特定的硬件平台。 3. 连接底层驱动:MQTT库通常需要与底层驱动程序进行连接,以实现与STM32芯片的通信。这可能涉及到串口、网络接口等底层驱动的配置和集成。 4. 配置MQTT:根据需要配置MQTT协议的参数,例如服务器地址、端口号、订阅/发布的主题等。这些参数可以在代码中进行配置,或者基于外部存储器(如EEPROM)进行配置,以便随时更改。 5. 处理MQTT消息:在STM32上实现MQTT协议的主要目的是能够发送和接收消息。因此,需要在代码中实现相应的消息处理函数,以便从服务器接收消息、订阅主题或发布消息。 6. 错误处理:在移植和使用过程中,可能会出现一些错误或异常情况。为了确保系统的稳定性和可靠性,需要实现适当的错误处理机制和异常处理代码。 在完成了上述步骤后,STM32就成功移植MQTT协议,并可以通过MQTT实现与其他设备之间的通信。这为在低带宽和不稳定网络环境下进行实时通信提供了一种轻量级和简便的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值