esp8266 SDK开发④MQTT官方库的使用以及实现定时发送数据到mqtt

时间:2024-04-10 09:12:00

首先是搭建好库,我搭建的方法是这样的:
1.把driver_lib文件夹改成app。
2.把examples文件夹里的IoT_Demo文件夹里的所有复制到app文件夹下,并且覆盖。
3.把examples文件夹下的esp_mqtt_proj文件夹里的内容全部复制到app文件夹下,并且覆盖。
4.把examples文件夹和third_party文件夹删除。
5.app文件夹下user文件夹里就留一个user_main.c和Makefile文件。
这样就完成了,然后我们把他导入开发平台,编译下没有问题。
接下来就是配置问题了,我参考了一位大哥的博客,大家去看他的博客就行:mqtt配置
然后就是写定时发送mqtt的函数了,这里实现5秒发送一次到mqtt,发送的是hello。
主函数部分:

void user_init(void)
{
    uart_init(74880, 74880);
    os_delay_us(60000);

    CFG_Load();

    MQTT_InitConnection(&mqttClient, sysCfg.mqtt_host, sysCfg.mqtt_port, sysCfg.security);
    //MQTT_InitConnection(&mqttClient, "192.168.11.122", 1880, 0);

    MQTT_InitClient(&mqttClient, sysCfg.device_id, sysCfg.mqtt_user, sysCfg.mqtt_pass, sysCfg.mqtt_keepalive, 1);
    //MQTT_InitClient(&mqttClient, "client_id", "user", "pass", 120, 1);

    MQTT_InitLWT(&mqttClient, "/lwt", "offline", 0, 0);
    MQTT_OnConnected(&mqttClient, mqttConnectedCb);
    MQTT_OnDisconnected(&mqttClient, mqttDisconnectedCb);
    //注意屏蔽这句话
    //MQTT_OnPublished(&mqttClient, mqttPublishedCb);
    MQTT_OnData(&mqttClient, mqttDataCb);
    WIFI_Connect(sysCfg.sta_ssid, sysCfg.sta_pwd, wifiConnectCb);

    INFO("\r\nSystem started ...\r\n");

    /** 关闭该定时器 */
    os_timer_disarm( &os_timer );
    /** 配置该定时器回调函数 */
    os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Task_Run ), NULL );
    /** 启动该定时器 */
    os_timer_arm( &os_timer, 1000, true );

}

循环函数部分:

void Task_Run(void)
{
	static uint16 i;
	i++;
	if(i>=4)
	{
		i=0;
	    MQTT_Publish(&mqttClient, "/mqtt/topic/0", "hello", 6, 0, 0);
        os_printf("hello\n");
	}
}

实验结果:
esp8266 SDK开发④MQTT官方库的使用以及实现定时发送数据到mqtt
说说遇到的问题:这里一定要屏蔽MQTT_OnPublished(&mqttClient, mqttPublishedCb)这句话,或者别调用它,发送直接用这句话MQTT_Publish(&mqttClient, “/mqtt/topic/0”, “hello”, 6, 0, 0);别用那个回调函数,试过不管用。然后如果有上面那句话,就会出现一直发送数据不能让他停止,而且发送的很快。
下面我把移植好的程序,和我最终实现的程序放在网盘:
链接:https://pan.baidu.com/s/1bpXk4BSLf7bX1B_CHAhzzQ
提取码:gv4p