【百问网】7天物联网智能家居实战 Day6

MQTT的移植

下载MQTT 嵌入式C/C++库

本次项目是是MQTT在STM32f103设备上的移植,因此使用paho的嵌入式C库,源码地址GitHub - eclipse/paho.mqtt.embedded-c: Paho MQTT C client library for embedded systems. Paho is an Eclipse IoT project (https://iot.eclipse.org/)

移植

 

 将以上文件全部移植到工程文件的协议层中去,然后参考../paho.mqtt.embedded-c/MQTTPacket/samples/中的例程编写代码

修改接口函数

由于移植的FreeRTOS_Manual中没有”FreeRTOS_IP.h”和”FreeRTOS_Sockets.h”这两个头文件,因此需要修改MQTTFreeRTOS.c/.h中删除”FreeRTOS_IP.h”和”FreeRTOS_Sockets.h”,并修改Network结构体以及相关接口函数。

struct Network

{

  ptNetDev netdev;

int (*mqttread) (Network*, unsigned char*, int, int);

int (*mqttwrite) (Network*, unsigned char*, int, int);

void (*disconnect) (Network*);

};

接下来是FreeRTOS_read和FreeRTOS_write函数:

int FreeRTOS_read(Network* n, unsigned char* buffer, int len, int timeout_ms)

{

TickType_t xTicksToWait = timeout_ms / portTICK_PERIOD_MS; /* convert milliseconds to ticks */

TimeOut_t xTimeOut;

int recvLen = 0;



vTaskSetTimeOutState(&xTimeOut); /* Record the time at which this function was entered. */

do

{

        recvLen = n->netdev->Read(n->netdev, (char*)buffer, len, timeout_ms);

//        if(n->netdev->Read(n->netdev, (char*)buffer, len, timeout_ms) == 0) recvLen = len;

} while (recvLen < len && xTaskCheckForTimeOut(&xTimeOut, &xTicksToWait) == pdFALSE);



return recvLen;

}



int FreeRTOS_write(Network* n, unsigned char* buffer, int len, int timeout_ms)

{

// TickType_t xTicksToWait = timeout_ms / portTICK_PERIOD_MS; /* convert milliseconds to ticks */

// TimeOut_t xTimeOut;

int sentLen = 0;



// vTaskSetTimeOutState(&xTimeOut); /* Record the time at which this function was entered. */

// do

// {

        if(n->netdev->Write(n->netdev, (char*)buffer, len, timeout_ms) == 0) sentLen = len;

// } while (sentLen < len && xTaskCheckForTimeOut(&xTimeOut, &xTicksToWait) == pdFALSE);



return sentLen;

}

最后是断开连接,建立连接与初始化函数:

void FreeRTOS_disconnect(Network* n)

{

    TCP_UDP_Info tcp = {TCP_ID};

n->netdev->Disconnect(n->netdev, (char*)&tcp, 100);

}



void NetworkInit(Network* n)

{

    const static WiFiInfo wifi = {WiFi_ID, "ChinaNet-PVwx", "3nwspwfc"};

    n->netdev = NetDev_GetDev(ESP8266);

    if(n->netdev != NULL)

    {

        if(n->netdev->Init(n->netdev) == 0)

        {

            if(n->netdev->Connect(n->netdev, (char*)&wifi, 5000) == 0)

            {

                printf("Connect WiFi success.\r\n");

                n->mqttread = FreeRTOS_read;

                n->mqttwrite = FreeRTOS_write;

                n->disconnect = FreeRTOS_disconnect;

            }

            else

            {

                printf("Connect WiFi failed.\r\n");

            }

        }

        else

        {

            printf("Net Device Init failed.\r\n");

        }

    }

    else

    {

        printf("Net Device not found.\r\n");

    }

}





int NetworkConnect(Network* n, char* addr, int port)

{

    TCP_UDP_Info tcp = {TCP_ID, addr, 0, port};

    return n->netdev->Connect(n->netdev, (char*)&tcp, 500);

}

至此MQTT协议已经移植完成。

最后是关于MQTT数据连接对象的一些注意事项:

  训练营导航:www.100ask.net

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值