将ESP8266通过MQTT协议链接阿里云IoT物联网平台
1 申请阿里云IoT平台
登录阿里云,申请开通IoT平台。https://iot.console.aliyun.com/lk/summary
1.1 注册产品和设备
在【设备管理】-【产品】中创建产品。
创建产品
在【设备管理】-【设备】中创建设备,其中DeviceName可以自动生成。
创建设备
1.2 添加产品的属性
在【设备管理】-【产品】-【功能定义】
功能定义
在自定义功能中添加属性。
添加属性
1.3 获取产品和设备信息
在【设备管理】-【设备】-【设备详情】可以找到DeviceName,DeviceSecret,ProductKey等信息,后续在接入时会需要。
设备详情
如果需要ProductSecret可以在【设备管理】-【产品】-【产品详情】中找到。
2 ESP8266设备端使用arduino开发
实现需要准备好ESP8266的开发板和Arduino开发环境,详细参考另一篇文章。https://www.jianshu.com/p/d236f8983871
2.1 获取MQTT的sample
事先在【Tools】- 【Manage Libraries】中安装PubSubClient库。
可以参考【File】-【Samples】-【PubSubClient】中的mqtt-esp8266例子。
2.2 支持MQTT协议
导入PubSubClient库,实现MQTT协议的传输。
修改例子中的Server地址,端口,用户名,以及命令的BODY和TOPIC。
#define MQTT_SERVER PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT 1883
#define MQTT_USRNAME DEVICE_NAME "&" PRODUCT_KEY
#define ALINK_BODY_FORMAT "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
2.3 集成阿里云IoT接入鉴权函数
参考MQTT连接签名示例,推荐直接引用里面的函数实现鉴权过程。
https://help.aliyun.com/document_detail/116333.html?spm=a2c4g.11186623.6.652.d9f63f86nJPMqY
参考链接的响应码,如果error为-4,就是鉴权失败。
iotx_dev_meta_info_t meta_info;
iotx_sign_mqtt_t sign_mqtt;
memset(&meta_info, 0, sizeof(iotx_dev_meta_info_t));
memcpy(meta_info.product_key, PRODUCT_KEY, strlen(PRODUCT_KEY));
memcpy(meta_info.product_secret, PRODUCT_SECRET, strlen(PRODUCT_SECRET));
memcpy(meta_info.device_name, DEVICE_NAME, strlen(DEVICE_NAME));
memcpy(meta_info.device_secret, DEVICE_SECRET, strlen(DEVICE_SECRET));
IOT_Sign_MQTT(IOTX_CLOUD_REGION_SHANGHAI, &meta_info, &sign_mqtt);
2.4 发送设备状态和云端设置状态命令的实现
sprintf(param, "{\"idle\":%d}", digitalRead(SENSOR_PIN));
sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
boolean bRet = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
Serial.println(bRet ? "OK" : "NG");
事先在【Tools】- 【Manage Libraries】中安装ArduinoJson库。
导入ArduinoJson库,实现Json串的解析。
StaticJsonDocument<MQTT_MAX_PACKET_SIZE> doc;
DeserializationError error = deserializeJson(doc, (char *)payload);
if (!error) //检查反序列化是否成功
{
//读取json节点
Serial.println(doc["id"].as<char*>());
boolean isIdle = doc["params"]["idle"];
Serial.println(isIdle);
}
3 调试
3.1 云端调试
利用阿里云的在线调试功能,可以接收设备Post的信息,也可以发送set命令给设备。
在【监控运维】-【在线调试】中选择设备后,选择调试的功能和方法,修改值发送指令给设备。
3.2 设备端调试
利用Arduino中的Serial Monitor监控串口的调试信息输出。
ESP8266相关文章阅读
《利用USB转TTL链接mini ESP8266进行开发和调试》 https://www.jianshu.com/p/2207a44dedc5
《ESP8266在线升级OTA的Arduino IDE实现方法之WebServer》 https://www.jianshu.com/p/b54b18f56d6a
《ESP8266串口数据错误不准确问题的解决》https://www.jianshu.com/p/7ddefcfc2acd
《如何利用Arduino IDE开发ESP8266程序?》https://www.jianshu.com/p/d236f8983871
《将ESP8266通过MQTT协议链接阿里云IoT物联网平台》 https://www.jianshu.com/p/4d6e216c2280