目前對接阿里雲物聯網平台有多種軟件和硬件,可以有多種不同語言來實現對接,比如c/c++,Java,JS,Python,C#等等,不過C#版本只有PC對接雲平台的代碼,嵌入式的目前還沒有看到,所以本篇文章是基於STM32F429芯片,采用C#語言對接阿里雲物聯網平台高級版。
下面是對接阿里雲物聯網平台的硬件,.Net Gadgeteer套件,有14個不同接口,可以對接近百種模塊。
我們今天選用的是溫濕度模塊,LED模塊,USB模塊和主板模塊,如下圖所示:
1、 USB Device模塊插入2#接口
2、 DHT11模塊插入14#接口
3、 LED模塊插入12#接口
4、 以太網模塊插入4#接口
第一步:我們需要在阿里雲物聯網平台創建一個產品及對應設備
和阿里雲官方示例不一樣的是,我們額外增加了一個屬性LED,具備讀寫能力,枚舉型變量,0-表示關燈,1-表示開燈
這個定義好后,我們創建設備,並且獲取設備的三元組。
第二步: 基於官方MQTT的C#代碼庫M2Mqtt.NetMf42嵌入式版本,實現Alink協議。
(1) 上傳數據到雲端
byte[] bytData = new byte[4]; float T = 0; float H = 0; int ret = gs.IOControl((int)(6*16+11)); //PG11 if (ret != -1) { bytData[0] = (byte)(ret & 0xFF); bytData[1] = (byte)(ret >> 8 & 0xFF); bytData[2] = (byte)(ret >> 16 & 0xFF); bytData[3] = (byte)(ret >> 24 & 0xFF); H = Byte2Float(bytData[0], bytData[1]); T = Byte2Float(bytData[2], bytData[3]); Debug.Print("H = " + H.ToString() + " T = " + T.ToString()); string payload_json = "{" + "\"id\": " + DateTime.Now.Ticks + "," + "\"params\":{" + "\"temperature\":" + T + "," + "\"humidity\":" + H + "," + "}," + "\"method\":\"thing.event.property.post\"" + "}"; string Data = Guid.NewGuid().ToString(); mqttClient.Publish(post_topic, Encoding.UTF8.GetBytes(payload_json), MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, false); Debug.Print(payload_json); }
讀取模塊的溫度T,和濕度H,然后推送到物聯網平台。
(2) 下發控制命令到設備
雲端單擊“發送指令”,則設備的MqttMsgPublishReceived事件會接收到如下格式的數據:
{"method":"thing.service.property.set","id":"196011725","params":{"LED":1},"version":"1.0.0"}
聲明LED對象后,我們就可以根據這個信息來開關LED燈(如下)
OutputPort led = new OutputPort((Cpu.Pin)(7*16+9),false);
然后在MqttMsgPublishReceived事件里做如下處理:
string json = ""; if (e.Message.Length > 0) { //{"method":"thing.service.property.set","id":"196011725","params":{"LED":1},"version":"1.0.0"} json = new string(System.Text.UTF8Encoding.UTF8.GetChars(e.Message)); Debug.Print("Message:" + json); string strLED =json.Substring(json.IndexOf("LED")+5,1); led.Write((strLED == "1")); }
第三步:運行代碼
運行后,打開阿里雲物聯網平台的網頁,可以看到如下畫面:
下發相關的指令,也會發現LED燈亮和滅。
本文相關的代碼文件:yfalink.rar
阿里雲物聯網平台鏈接:https://dev.iot.aliyun.com/sale?source=deveco_partner_yefan