物联网专题32:百度云物联网 ESP8266

物联网云平台介绍

百度云物联网组件,适合刚接触MQTT协议的初学者。

阿里云物联网组件的MQTT用户名、密码,需要先使用算法加密;设备发布和订阅的topic受到限制,需使用【规则引擎】功能来实现客户端与客户端的通信。

腾讯云物联网组件的接入需使用证书 / 密钥,并且设备发布和订阅的topic受到限制。

 

天工物接入:作为MQTT服务端,是【百度云物联网平台】的入口。

1 进入百度云官网,选择帮助与支持->帮助中心->文档;

物联网专题32:百度云物联网 ESP8266_第1张图片

2 选择物联网服务->物接入 IoT Hub

物联网专题32:百度云物联网 ESP8266_第2张图片

3 物接入的基本描述

物联网专题32:百度云物联网 ESP8266_第3张图片

百度云物联网平台基于MQTT协议,支持QoS = 0,QoS = 1。

4 系统限制

物联网专题32:百度云物联网 ESP8266_第4张图片

5 百度云定价

消息数计算

物联网专题32:百度云物联网 ESP8266_第5张图片

计费 / 免费项目

物联网专题32:百度云物联网 ESP8266_第6张图片

可以看到,百度云的免费消息数其实非常多,对于个人用户基本上用不完。即使我们的消息量非常大,一个月也就一块钱,可以说是非常便宜很良心的价格。

6 开通百度云物联网

选择 产品->物联网服务->物接入 IoT Hub

物联网专题32:百度云物联网 ESP8266_第7张图片

选择立即使用

物联网专题32:百度云物联网 ESP8266_第8张图片

这里,我们需要先注册百度云账户,再实名认证,过程比较繁琐。

 

接下来,就是容易踩坑的地方。

百度云升级了,可以创建两种项目类型:设备型和数据型。具体区别就是,设备型功能还不清除,数据型是我们使用ESP8266连接百度云常用的。

 

设备型项目(不常用)

7 创建项目;

物联网专题32:百度云物联网 ESP8266_第9张图片

填写相关信息,项目创建成功,如下图所示:

物联网专题32:百度云物联网 ESP8266_第10张图片

8 新建物模型和物影子,配置如下:

物模型:

物联网专题32:百度云物联网 ESP8266_第11张图片

物影子:

物联网专题32:百度云物联网 ESP8266_第12张图片

然后会有生成的密钥,保存如下:

物联网专题32:百度云物联网 ESP8266_第13张图片

9 使用MQTT客户端软件进行连接,详细配置如下:

1 设备信息:

物联网专题32:百度云物联网 ESP8266_第14张图片

2 用户名密码信息:

物联网专题32:百度云物联网 ESP8266_第15张图片

3 连接百度云,结果如下(连接成功):

物联网专题32:百度云物联网 ESP8266_第16张图片

 

数据型项目(ESP8266设备)

这个才是ESP8266开发过程中,我们需要关注的重点。

参考链接如下:https://cloud.baidu.com/doc/IOT/s/Fjwvy7b6q

1 创建数据型,成功后结果如下:

物联网专题32:百度云物联网 ESP8266_第17张图片

2 创建策略列表;

物联网专题32:百度云物联网 ESP8266_第18张图片

3 创建身份列表;

物联网专题32:百度云物联网 ESP8266_第19张图片

3 创建用户列表;

物联网专题32:百度云物联网 ESP8266_第20张图片

我们创建2个用户,配置参数相同。其中,MQTT用户是使用MQTTFX软件进行测试使用,8266用户,对应实际的ESP8266开发板(云下设备)。

4 我们得到了参数如下所示:

物联网专题32:百度云物联网 ESP8266_第21张图片

5 使用MQTT软件进行连接:

物联网专题32:百度云物联网 ESP8266_第22张图片

连接成功,结果如图所示:

物联网专题32:百度云物联网 ESP8266_第23张图片

 

使用ESP8266接入百度云

整个的工程比较复杂,只看重点的核心功能。

1 订阅主题:SW_LED

// MQTT已成功连接:ESP8266发送【CONNECT】,并接收到【CONNACK】
//============================================================================
void mqttConnectedCb(uint32_t *args)
{
    MQTT_Client* client = (MQTT_Client*)args;	// 获取mqttClient指针

    INFO("MQTT: Connected\r\n");

    // 【参数2:主题过滤器 / 参数3:订阅Qos】
    //-----------------------------------------------------------------
	MQTT_Subscribe(client, "SW_LED", 0);	// 订阅主题"SW_LED",QoS=0
//	MQTT_Subscribe(client, "SW_LED", 1);
//	MQTT_Subscribe(client, "SW_LED", 2);

	// 【参数2:主题名 / 参数3:发布消息的有效载荷 / 参数4:有效载荷长度 / 参数5:发布Qos / 参数6:Retain】
	//-------------------------------------------------------------------------------------
    // 向主题"SW_LED"发布"ESP8266_Online",Qos=0、retain=0	
    MQTT_Publish(client, "SW_LED", "ESP8266_Online", strlen("ESP8266_Online"), 0, 0);	
//	MQTT_Publish(client, "SW_LED", "ESP8266_Online", strlen("ESP8266_Online"), 1, 0);
//	MQTT_Publish(client, "SW_LED", "ESP8266_Online", strlen("ESP8266_Online"), 2, 0);
}

2 如果接收到订阅消息,则开 / 关灯;

// 【接收MQTT的[PUBLISH]数据】函数		
// 【参数1:主题 / 参数2:主题长度 / 参数3:有效载荷 / 参数4:有效载荷长度】
//=======================================================================================
void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
{
    char *topicBuf = (char*)os_zalloc(topic_len+1);		// 申请【主题】空间
    char *dataBuf  = (char*)os_zalloc(data_len+1);		// 申请【有效载荷】空间


    MQTT_Client* client = (MQTT_Client*)args;	// 获取MQTT_Client指针


    os_memcpy(topicBuf, topic, topic_len);	// 缓存主题
    topicBuf[topic_len] = 0;				// 最后添'\0'

    os_memcpy(dataBuf, data, data_len);		// 缓存有效载荷
    dataBuf[data_len] = 0;					// 最后添'\0'

    INFO("Receive topic: %s, data: %s \r\n", topicBuf, dataBuf);	// 串口打印【主题】【有效载荷】
    INFO("Topic_len = %d, Data_len = %d\r\n", topic_len, data_len);	// 串口打印【主题长度】【有效载荷长度】


// 【技小新】添加
//#############################################################################
    // 根据接收到的主题名/有效载荷,控制LED的亮/灭
    //-----------------------------------------------------------------------------------
    if( os_strcmp(topicBuf,"SW_LED") == 0 )			// 主题 == "SW_LED"
    {
    	if( os_strcmp(dataBuf,"LED_ON") == 0 )		// 有效载荷 == "LED_ON"
    	{
    		GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);		// LED亮
    	}

    	else if( os_strcmp(dataBuf,"LED_OFF") == 0 )	// 有效载荷 == "LED_OFF"
    	{
    		GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);			// LED灭
    	}
    }
//##################################################################################


    os_free(topicBuf);	// 释放【主题】空间
    os_free(dataBuf);	// 释放【有效载荷】空间
}
//=======================================================================================

下载执行程序,结果如下所示:

1 ESP8266上电复位后,调试助手获取到了MQTT服务器的域名,成功订阅主题并发布上线消息;同时,在MQTT-FX也成功的接收到了SW_LED主题的载荷消息。如下所示:

物联网专题32:百度云物联网 ESP8266_第24张图片

2 通过MQTT-FX服务端,向SW_LED主题发布LED_ON消息,LED被点亮;

物联网专题32:百度云物联网 ESP8266_第25张图片

如图所示:

物联网专题32:百度云物联网 ESP8266_第26张图片

这说明,ESP8266连接百度云成功。

你可能感兴趣的:(IoT)