阿里雲物聯網平臺體驗(NetGadgeteer+C#篇)
目前對接阿里雲物聯網平臺有多種軟體和硬體,可以有多種不同語言來實現對接,比如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