引言
作爲物聯網開發者,ESP8266應該一點都不陌生了。只需十幾塊錢淘寶一個小開發板,就可以連上Wi-Fi接入互聯網,盡情享受從手機端或Web端控制設備的樂趣。ESP8266接入Wi-Fi是沒問題,但是用戶端不能直接設計成與ESP8266通信,還是需要一箇中心服務器作爲用戶端和設備端的代理。一種方案是自己搭建設計這麼一箇中心服務器,只是費時費力;另一種方案,就是直接使用大廠提供的物聯網平臺服務,使設計方案PaaS化。
上網搜尋物聯網平臺方案,百度、阿里、騰訊早就推出了自己的物聯網平臺了,同時也收集了一點其他公司的平臺。之後我就對這三大平臺以及一些常見的平臺簡單評估了一下。最後還是選擇了阿里雲物聯網平臺(以下簡稱阿里雲IoT hub)深入瞭解。
那麼,關於ESP8266和阿里雲IoT hub,首先要告訴大家,樂鑫官方github上已經有了「ESP8266 對接阿里雲」的repository了,github:https://github.com/espressif/esp8266-aliyun-demo
但是!當我下載下來並經過一陣焦頭爛額的編譯測試後,依舊沒法成功編譯!最最最關鍵的是,不支持安信可ESP8266 IDE,似乎是因爲修改了頂層Makfile文件。
一氣之下!我根據阿里雲IoT hub提供的文檔,首先使用Python腳本模擬設備對接阿里雲IoT Hub,然後使用ESP8266嘗試連接MQTT Broker,最後使用ESP8266基於官方SDK,自己弄了一個esp8266 app,接入了阿里雲物聯網平臺。github:https://github.com/AngelLiang/esp8266_aliyun_mqtt_app
適合讀者
本文適合有ESP8266開發經驗的讀者閱讀,如果熟悉安信可ESP8266 IDE更佳。熟悉阿里雲IoT hub和開發環境的讀者可以直接跳到「四、下載aliyun_mqtt_app並導入」小節。
一、獲取阿里雲IoT設備認證三元組
本小節主要講如何獲取阿里雲IoT hub設備認證三元組,熟悉的讀者可以跳過了。
第一步:開通平臺
首先,需要進入阿里雲IoT hub控制檯進行操作,如果沒有開通直接開通即可,免費。控制檯連接:https://www.aliyun.com/product/iot
第二步:創建產品
開通後我們首先需要創建產品,產品名稱隨便輸入即可,其他默認。
第三步:創建設備
然後是創建設備,隨便輸入一個DeviceName即可。
第四步:獲取認證三元組
最後就得到了設備認證三元組:ProductKey、DeviceName和DeviceSecret。
二、安信可ESP8266 IDE
下面是如何搭建安信可ESP8266 IDE環境的文檔,熟悉的讀者可以直接跳過了:
- 如何安裝安信可一體化開發環境:http://wiki.ai-thinker.com/ai_ide_install
- 如何使用安信可 ESP 系列一體化開發環境:http://wiki.ai-thinker.com/ai_ide_use
- 如何爲 ESP 系列模組燒錄固件:http://wiki.ai-thinker.com/esp_download
三、ESP8266官方SDK
最後是如何下載ESP8266官方SDK,可以到樂鑫官網或github或者下載。熟悉的讀者也可以直接跳過。本人開發所使用的SDK是目前最新的版本:ESP8266_NONOS_SDK-2.2.1,aliyun_mqtt_app理論上支持SDK 2.0+。
下載官方SDK後,把driver_lib
、examples
和third_party
三個文件夾壓縮備份再刪除,以免編譯的時候出現干擾信息。
四、下載aliyun_mqtt_app並導入
下載aliyun_mqtt_app(github:https://github.com/AngelLiang/esp8266_aliyun_mqtt_app)並拷貝aliyun_mqtt_app文件夾過去。
編輯app/include/user_config.h
文件,修改下面信息,然後編譯下載並重啓ESP8266,最後應該就能在控制檯看到設備上線了。
#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"
五、接入成功
編譯、下載、重啓,觀察串口打印的信息,感覺沒有異常後在看看控制檯,可以看到設備已經接入成功了!
然後到設備的topic列表,可以看到 update topic 消息數加1了,那是因爲我在代碼裏面寫了只要連接成功就發佈一條「hello」消息。
然後嘗試一下對get topic發佈消息!
可以看到串口打印如下:
TCP: data received 45 bytes
Receive topic: /PRODUCT_KEY/esp8266_test/get, data: hello wolrd!
此時說明「設備主動上報數據到平臺」和「平臺下發指令到設備」這兩個功能均測試成功!
六、關於阿里雲IoT hub
接入方式
根據文檔,阿里雲IoT hub至少支持三種設備接入方式:
- MQTT方式,包括基於TCP的MQTT和基於WebSocket的MQTT
- CoAP
- HTTP
其中對於ESP8266來說,最方便的還是基於MQTT-TCP方式。當然,阿里雲IoT hub除了支持單一設備接入方式,也支持網關設備的接入。
計費方面
目前開通平臺是免費。收費方法是按消息數量收費,不過每月前100萬條消息免費,對於我這種物聯網愛好者隨便玩玩足夠了。
基礎版和高級版
實際上,阿里雲IoT hub分爲兩個版本:基礎版和高級版。高級版在基礎版所有功能的基礎上,還多了一些實用功能,當然,高級版也是免費開通的,收費方面高級版則多了一個設備日活費用,0.01元/每日活設備/天,目前每個帳號有10個設備的免費額度。
高級版令我關注的有一點:設備的數據存儲和查詢功能。設備端只要根據阿里雲IoT hub高級版的物模型和Alink協議上傳數據,阿里雲IoT hub就會存儲相關數據,同時還可以通過雲端API獲取歷史數據。
相關術語:
- 物模型:阿里雲IoT hub對設備在雲端的功能描述,包括設備的屬性、服務和事件。
- Alink協議:阿里雲定義的設備與雲端之間的通信協議。
那麼有關阿里雲IoT hub的介紹就到這裏,下面是簡單說下我寫的aliyun_mqtt_app。
七、關於aliyun_mqtt_app
自然,我在引言已經提到弄出這麼一個app工程的原因了。下面是對這個app簡單介紹一下。
由於ESP8266官方SDK中已經有了MQTT示例工程,所以我是在此工程的基礎上補充了一點自己的代碼。其中最麻煩的是阿里雲IoT hub設備認證問題,直接使用MQTT示例工程填寫有關MQTT的配置信息也可以,只是mqtt password要先在PC端生成好才行,使用字符串拼接方式靜態生成設備認證三元組似乎還做不了。那就乾脆一點,讓ESP8266能動態生成阿里雲的mqtt password就可以了,也就是一個hmacmd5簽名。
mqtt password生成的核心代碼在 user/aliyun_mqtt.c/gen_mqtt_password() 函數裏。
之後,就是加了點輔助功能,比如可以使用smartconfig配置Wi-Fi,這樣就可以不用把Wi-Fi信息寫死到代碼了。同時,阿里雲IoT hub大多是使用JSON格式傳輸數據,給app上cJSON解析的工作以後有空就考慮考慮(ESP8266使用cJSON解析器已經有了,在我的ESP8266工程示例集合倉庫裏)。
八、結語
自此,洋洋灑灑長篇大論有話沒話寫了那麼多,本文簡而言之就介紹瞭如何使用ESP8266接入阿里雲IoT hub,至於能玩出什麼花樣就要靠開發者的想象力了。話說,某平臺是不是應該給我點軟文費呢~?
相關資料
- esp8266 aliyun mqtt app:https://github.com/AngelLiang/esp8266_aliyun_mqtt_app
- 阿里雲物聯網平臺文檔:https://help.aliyun.com/product/30520.html
- 阿里雲IoT hub - MQTT-TCP連接通信:https://help.aliyun.com/document_detail/73742.html