智能硬件(Arduino、树莓派等)

将ESP8266通过MQTT协议链接阿里云IoT物联网平台

2019-06-19  本文已影响0人  interboy

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命令给设备。
在【监控运维】-【在线调试】中选择设备后,选择调试的功能和方法,修改值发送指令给设备。

云端调试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

上一篇下一篇

猜你喜欢

热点阅读