1 申請阿里云IoT平臺
登錄阿里云,申請開通IoT平臺。https://iot.console.aliyun.com/lk/summary
1.1 注冊產品和設備
在【設備管理】-【產品】中創(chuàng)建產品。

在【設備管理】-【設備】中創(chuàng)建設備,其中DeviceName可以自動生成。

1.2 添加產品的屬性
在【設備管理】-【產品】-【功能定義】

在自定義功能中添加屬性。

1.3 獲取產品和設備信息
在【設備管理】-【設備】-【設備詳情】可以找到DeviceName,DeviceSecret,ProductKey等信息,后續(xù)在接入時會需要。

如果需要ProductSecret可以在【設備管理】-【產品】-【產品詳情】中找到。
2 ESP8266設備端使用arduino開發(fā)
實現需要準備好ESP8266的開發(fā)板和Arduino開發(fā)環(huán)境,詳細參考另一篇文章。http://www.itdecent.cn/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 發(fā)送設備狀態(tài)和云端設置狀態(tài)命令的實現
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節(jié)點
Serial.println(doc["id"].as<char*>());
boolean isIdle = doc["params"]["idle"];
Serial.println(isIdle);
}
3 調試
3.1 云端調試
利用阿里云的在線調試功能,可以接收設備Post的信息,也可以發(fā)送set命令給設備。
在【監(jiān)控運維】-【在線調試】中選擇設備后,選擇調試的功能和方法,修改值發(fā)送指令給設備。

3.2 設備端調試
利用Arduino中的Serial Monitor監(jiān)控串口的調試信息輸出。
ESP8266相關文章閱讀
《利用USB轉TTL鏈接mini ESP8266進行開發(fā)和調試》 http://www.itdecent.cn/p/2207a44dedc5
《ESP8266在線升級OTA的Arduino IDE實現方法之WebServer》 http://www.itdecent.cn/p/b54b18f56d6a
《ESP8266串口數據錯誤不準確問題的解決》http://www.itdecent.cn/p/7ddefcfc2acd
《如何利用Arduino IDE開發(fā)ESP8266程序?》http://www.itdecent.cn/p/d236f8983871
《將ESP8266通過MQTT協議鏈接阿里云IoT物聯網平臺》 http://www.itdecent.cn/p/4d6e216c2280