物联网云平台介绍
百度云物联网组件,适合刚接触MQTT协议的初学者。
阿里云物联网组件的MQTT用户名、密码,需要先使用算法加密;设备发布和订阅的topic受到限制,需使用【规则引擎】功能来实现客户端与客户端的通信。
腾讯云物联网组件的接入需使用证书 / 密钥,并且设备发布和订阅的topic受到限制。
天工物接入:作为MQTT服务端,是【百度云物联网平台】的入口。
1 进入百度云官网,选择帮助与支持->帮助中心->文档;
2 选择物联网服务->物接入 IoT Hub
3 物接入的基本描述
百度云物联网平台基于MQTT协议,支持QoS = 0,QoS = 1。
4 系统限制
5 百度云定价
消息数计算
计费 / 免费项目
可以看到,百度云的免费消息数其实非常多,对于个人用户基本上用不完。即使我们的消息量非常大,一个月也就一块钱,可以说是非常便宜很良心的价格。
6 开通百度云物联网
选择 产品->物联网服务->物接入 IoT Hub
选择立即使用
这里,我们需要先注册百度云账户,再实名认证,过程比较繁琐。
接下来,就是容易踩坑的地方。
百度云升级了,可以创建两种项目类型:设备型和数据型。具体区别就是,设备型功能还不清除,数据型是我们使用ESP8266连接百度云常用的。
设备型项目(不常用)
7 创建项目;
填写相关信息,项目创建成功,如下图所示:
8 新建物模型和物影子,配置如下:
物模型:
物影子:
然后会有生成的密钥,保存如下:
9 使用MQTT客户端软件进行连接,详细配置如下:
1 设备信息:
2 用户名密码信息:
3 连接百度云,结果如下(连接成功):
数据型项目(ESP8266设备)
这个才是ESP8266开发过程中,我们需要关注的重点。
参考链接如下:https://cloud.baidu.com/doc/IOT/s/Fjwvy7b6q
1 创建数据型,成功后结果如下:
2 创建策略列表;
3 创建身份列表;
3 创建用户列表;
我们创建2个用户,配置参数相同。其中,MQTT用户是使用MQTTFX软件进行测试使用,8266用户,对应实际的ESP8266开发板(云下设备)。
4 我们得到了参数如下所示:
5 使用MQTT软件进行连接:
连接成功,结果如图所示:
使用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主题的载荷消息。如下所示:
2 通过MQTT-FX服务端,向SW_LED主题发布LED_ON消息,LED被点亮;
如图所示:
这说明,ESP8266连接百度云成功。