引言
作為物聯(lián)網(wǎng)開(kāi)發(fā)者,ESP8266應(yīng)該一點(diǎn)都不陌生了。只需十幾塊錢(qián)淘寶一個(gè)小開(kāi)發(fā)板,就可以連上Wi-Fi接入互聯(lián)網(wǎng),盡情享受從手機(jī)端或Web端控制設(shè)備的樂(lè)趣。ESP8266接入Wi-Fi是沒(méi)問(wèn)題,但是用戶(hù)端不能直接設(shè)計(jì)成與ESP8266通信,還是需要一個(gè)中心服務(wù)器作為用戶(hù)端和設(shè)備端的代理。一種方案是自己搭建設(shè)計(jì)這么一個(gè)中心服務(wù)器,只是費(fèi)時(shí)費(fèi)力;另一種方案,就是直接使用大廠(chǎng)提供的物聯(lián)網(wǎng)平臺(tái)服務(wù),使設(shè)計(jì)方案PaaS化。
上網(wǎng)搜尋物聯(lián)網(wǎng)平臺(tái)方案,百度、阿里、騰訊早就推出了自己的物聯(lián)網(wǎng)平臺(tái)了,同時(shí)也收集了一點(diǎn)其他公司的平臺(tái)。之后我就對(duì)這三大平臺(tái)以及一些常見(jiàn)的平臺(tái)簡(jiǎn)單評(píng)估了一下。最后還是選擇了阿里云物聯(lián)網(wǎng)平臺(tái)(以下簡(jiǎn)稱(chēng)阿里云IoT hub)深入了解。
那么,關(guān)于ESP8266和阿里云IoT hub,首先要告訴大家,樂(lè)鑫官方github上已經(jīng)有了「ESP8266 對(duì)接阿里云」的repository了,github:https://github.com/espressif/esp8266-aliyun-demo
但是!當(dāng)我下載下來(lái)并經(jīng)過(guò)一陣焦頭爛額的編譯測(cè)試后,依舊沒(méi)法成功編譯!最最最關(guān)鍵的是,不支持安信可ESP8266 IDE,似乎是因?yàn)樾薷牧隧攲覯akfile文件。
一氣之下!我根據(jù)阿里云IoT hub提供的文檔,首先使用Python腳本模擬設(shè)備對(duì)接阿里云IoT Hub,然后使用ESP8266嘗試連接MQTT Broker,最后使用ESP8266基于官方SDK,自己弄了一個(gè)esp8266 app,接入了阿里云物聯(lián)網(wǎng)平臺(tái)。github:https://github.com/AngelLiang/esp8266_aliyun_mqtt_app
適合讀者
本文適合有ESP8266開(kāi)發(fā)經(jīng)驗(yàn)的讀者閱讀,如果熟悉安信可ESP8266 IDE更佳。熟悉阿里云IoT hub和開(kāi)發(fā)環(huán)境的讀者可以直接跳到「四、下載aliyun_mqtt_app并導(dǎo)入」小節(jié)。
一、獲取阿里云IoT設(shè)備認(rèn)證三元組
本小節(jié)主要講如何獲取阿里云IoT hub設(shè)備認(rèn)證三元組,熟悉的讀者可以跳過(guò)了。
第一步:開(kāi)通平臺(tái)
首先,需要進(jìn)入阿里云IoT hub控制臺(tái)進(jìn)行操作,如果沒(méi)有開(kāi)通直接開(kāi)通即可,免費(fèi)??刂婆_(tái)連接:https://www.aliyun.com/product/iot

第二步:創(chuàng)建產(chǎn)品
開(kāi)通后我們首先需要?jiǎng)?chuàng)建產(chǎn)品,產(chǎn)品名稱(chēng)隨便輸入即可,其他默認(rèn)。

第三步:創(chuàng)建設(shè)備
然后是創(chuàng)建設(shè)備,隨便輸入一個(gè)DeviceName即可。

第四步:獲取認(rèn)證三元組
最后就得到了設(shè)備認(rèn)證三元組:ProductKey、DeviceName和DeviceSecret。

二、安信可ESP8266 IDE
下面是如何搭建安信可ESP8266 IDE環(huán)境的文檔,熟悉的讀者可以直接跳過(guò)了:
- 如何安裝安信可一體化開(kāi)發(fā)環(huán)境:http://wiki.ai-thinker.com/ai_ide_install
- 如何使用安信可 ESP 系列一體化開(kāi)發(fā)環(huán)境:http://wiki.ai-thinker.com/ai_ide_use
- 如何為 ESP 系列模組燒錄固件:http://wiki.ai-thinker.com/esp_download
三、ESP8266官方SDK
最后是如何下載ESP8266官方SDK,可以到樂(lè)鑫官網(wǎng)或github或者下載。熟悉的讀者也可以直接跳過(guò)。本人開(kāi)發(fā)所使用的SDK是目前最新的版本:ESP8266_NONOS_SDK-2.2.1,aliyun_mqtt_app理論上支持SDK 2.0+。
下載官方SDK后,把driver_lib、examples和third_party三個(gè)文件夾壓縮備份再刪除,以免編譯的時(shí)候出現(xiàn)干擾信息。

四、下載aliyun_mqtt_app并導(dǎo)入
下載aliyun_mqtt_app(github:https://github.com/AngelLiang/esp8266_aliyun_mqtt_app)并拷貝aliyun_mqtt_app文件夾過(guò)去。
編輯app/include/user_config.h文件,修改下面信息,然后編譯下載并重啟ESP8266,最后應(yīng)該就能在控制臺(tái)看到設(shè)備上線(xiàn)了。
#define PRODUCT_KEY "PRODUCT_KEY"
#define DEVICE_NAME "DEVICE_NAME"
#define DEVICE_SECRET "DEVICE_SECRET"
#define WIFI_SSID "WIFI_SSID"
#define WIFI_PASS "WIFI_PASS"
五、接入成功
編譯、下載、重啟,觀(guān)察串口打印的信息,感覺(jué)沒(méi)有異常后在看看控制臺(tái),可以看到設(shè)備已經(jīng)接入成功了!

然后到設(shè)備的topic列表,可以看到 update topic 消息數(shù)加1了,那是因?yàn)槲以诖a里面寫(xiě)了只要連接成功就發(fā)布一條「hello」消息。

然后嘗試一下對(duì)get topic發(fā)布消息!

可以看到串口打印如下:
TCP: data received 45 bytes
Receive topic: /PRODUCT_KEY/esp8266_test/get, data: hello wolrd!
此時(shí)說(shuō)明「設(shè)備主動(dòng)上報(bào)數(shù)據(jù)到平臺(tái)」和「平臺(tái)下發(fā)指令到設(shè)備」這兩個(gè)功能均測(cè)試成功!
六、關(guān)于阿里云IoT hub
接入方式
根據(jù)文檔,阿里云IoT hub至少支持三種設(shè)備接入方式:
- MQTT方式,包括基于TCP的MQTT和基于WebSocket的MQTT
- CoAP
- HTTP
其中對(duì)于ESP8266來(lái)說(shuō),最方便的還是基于MQTT-TCP方式。當(dāng)然,阿里云IoT hub除了支持單一設(shè)備接入方式,也支持網(wǎng)關(guān)設(shè)備的接入。
計(jì)費(fèi)方面
目前開(kāi)通平臺(tái)是免費(fèi)。收費(fèi)方法是按消息數(shù)量收費(fèi),不過(guò)每月前100萬(wàn)條消息免費(fèi),對(duì)于我這種物聯(lián)網(wǎng)愛(ài)好者隨便玩玩足夠了。
基礎(chǔ)版和高級(jí)版
實(shí)際上,阿里云IoT hub分為兩個(gè)版本:基礎(chǔ)版和高級(jí)版。高級(jí)版在基礎(chǔ)版所有功能的基礎(chǔ)上,還多了一些實(shí)用功能,當(dāng)然,高級(jí)版也是免費(fèi)開(kāi)通的,收費(fèi)方面高級(jí)版則多了一個(gè)設(shè)備日活費(fèi)用,0.01元/每日活設(shè)備/天,目前每個(gè)帳號(hào)有10個(gè)設(shè)備的免費(fèi)額度。
高級(jí)版令我關(guān)注的有一點(diǎn):設(shè)備的數(shù)據(jù)存儲(chǔ)和查詢(xún)功能。設(shè)備端只要根據(jù)阿里云IoT hub高級(jí)版的物模型和Alink協(xié)議上傳數(shù)據(jù),阿里云IoT hub就會(huì)存儲(chǔ)相關(guān)數(shù)據(jù),同時(shí)還可以通過(guò)云端API獲取歷史數(shù)據(jù)。
相關(guān)術(shù)語(yǔ):
- 物模型:阿里云IoT hub對(duì)設(shè)備在云端的功能描述,包括設(shè)備的屬性、服務(wù)和事件。
- Alink協(xié)議:阿里云定義的設(shè)備與云端之間的通信協(xié)議。

那么有關(guān)阿里云IoT hub的介紹就到這里,下面是簡(jiǎn)單說(shuō)下我寫(xiě)的aliyun_mqtt_app。
七、關(guān)于aliyun_mqtt_app
自然,我在引言已經(jīng)提到弄出這么一個(gè)app工程的原因了。下面是對(duì)這個(gè)app簡(jiǎn)單介紹一下。
由于ESP8266官方SDK中已經(jīng)有了MQTT示例工程,所以我是在此工程的基礎(chǔ)上補(bǔ)充了一點(diǎn)自己的代碼。其中最麻煩的是阿里云IoT hub設(shè)備認(rèn)證問(wèn)題,直接使用MQTT示例工程填寫(xiě)有關(guān)MQTT的配置信息也可以,只是mqtt password要先在電腦生成好才行,直接拼接設(shè)備認(rèn)證三元組還做不到。那就干脆一點(diǎn),我直接讓ESP8266能生成阿里云的mqtt password就可以了,也就是一個(gè)hmacmd5簽名。
mqtt password生成的核心代碼在 user/aliyun_mqtt.c/gen_mqtt_password() 函數(shù)里。
之后,就是加了點(diǎn)輔助功能,比如可以使用smartconfig配置Wi-Fi,這樣就可以不用把Wi-Fi信息寫(xiě)死到代碼了。同時(shí),阿里云IoT hub大多是使用JSON格式傳輸數(shù)據(jù),給app上cJSON解析的工作以后有空就考慮考慮(ESP8266使用cJSON解析器已經(jīng)有了,在我的ESP8266工程示例集合倉(cāng)庫(kù)里)。
八、結(jié)語(yǔ)
自此,洋洋灑灑長(zhǎng)篇大論有話(huà)沒(méi)話(huà)寫(xiě)了那么多,本文簡(jiǎn)而言之就介紹了如何使用ESP8266接入阿里云IoT hub,至于能玩出什么花樣就要靠開(kāi)發(fā)者的想象力了。話(huà)說(shuō),某平臺(tái)是不是應(yīng)該給我點(diǎn)軟文費(fèi)呢~?
相關(guān)資料
- esp8266 aliyun mqtt app:https://github.com/AngelLiang/esp8266_aliyun_mqtt_app
- 阿里云物聯(lián)網(wǎng)平臺(tái)文檔:https://help.aliyun.com/product/30520.html
- 阿里云IoT hub - MQTT-TCP連接通信:https://help.aliyun.com/document_detail/73742.html