天天看點

.NET平台裝置使用C#語言接入阿裡雲IoT

1. 準備工作

1.1 注冊阿裡雲賬号

使用淘寶賬号或手機号,開通阿裡雲賬号,并通過實名認證(可以用支付寶認證)

1.2 免費開通IoT物聯網套件

産品官網

https://www.aliyun.com/product/iot
.NET平台裝置使用C#語言接入阿裡雲IoT

1.3 軟體開發環境

  • 語言 C#
  • 工具 Visual Studio IDE

2. IoT平台雲端開發

2.1 建立基礎版産品

産品資訊

.NET平台裝置使用C#語言接入阿裡雲IoT

消息通信Topic

.NET平台裝置使用C#語言接入阿裡雲IoT

2.2 注冊裝置

擷取裝置身份三元組,ProductKey,DeviceName,DeviceSecret

.NET平台裝置使用C#語言接入阿裡雲IoT

3. 裝置端開發

3.1 IoT平台接入password簽名算法檔案

簽名規則參考

https://www.yuque.com/cloud-dev/iot-tech/mebm5g
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
namespace iotxsdkmqttnet {
    public class IotSignUtils {
        public static string sign(Dictionary<string, string> param, 
                            string deviceSecret, string signMethod) {
            string[] sortedKey = param.Keys.ToArray();
            Array.Sort(sortedKey);

            StringBuilder builder = new StringBuilder();
            foreach(var i in sortedKey){
                builder.Append(i).Append(param[i]);
            }

            byte[] key = Encoding.UTF8.GetBytes(deviceSecret);
            byte[] signContent = Encoding.UTF8.GetBytes(builder.ToString());
            //這裡根據signMethod動态調整,本例子寫死了: 'hmacmd5'
            var hmac = new HMACMD5(key);
            byte[] hashBytes = hmac.ComputeHash(signContent);

            StringBuilder signBuilder = new StringBuilder();
            foreach (byte b in hashBytes)
                signBuilder.AppendFormat("{0:x2}", b);

            return signBuilder.ToString();
        }
    }
}           

3.2 接入IoT平台C#版本的MQTT庫

C#的mqtt庫 

https://www.nuget.org/packages/M2Mqtt/

3.3 裝置端應用程式

using System;
using System.Net;
using System.Collections.Generic;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using System.Text;
using System.Linq;

namespace iotMqttDemo {
    class MainClass {
        static string ProductKey = "******";
        static string DeviceName = "******";
        static string DeviceSecret = "******";
        static string RegionId = "cn-shanghai";

        static string PubTopic = "/" + ProductKey + "/" + DeviceName + "/update";
        static string SubTopic = "/" + ProductKey + "/" + DeviceName + "/get";

        public static void Main(string[] args)
        {
            IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
            string clientId = host.AddressList.FirstOrDefault(
                ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToString();
            string t = Convert.ToString(DateTimeOffset.Now.ToUnixTimeMilliseconds());
            string signmethod = "hmacmd5";

            Dictionary<string, string> dict = new Dictionary<string, string>();
            dict.Add("productKey", ProductKey);
            dict.Add("deviceName", DeviceName);
            dict.Add("clientId", clientId);
            dict.Add("timestamp", t);

            string mqttUserName = DeviceName + "&" + ProductKey;
            string mqttPassword = IotSignUtils.sign(dict, DeviceSecret, signmethod);
            string mqttClientId = clientId + "|securemode=3,signmethod="+signmethod+",timestamp=" + t + "|";
            
            string targetServer = ProductKey + ".iot-as-mqtt." + RegionId + ".aliyuncs.com";
            
            ConnectMqtt(targetServer, mqttClientId, mqttUserName, mqttPassword);
        }

        static void ConnectMqtt(string targetServer, string mqttClientId, string mqttUserName, string mqttPassword){
            MqttClient client = new MqttClient(targetServer);
            client.ProtocolVersion = MqttProtocolVersion.Version_3_1_1;

            client.Connect(mqttClientId, mqttUserName, mqttPassword, false, 60);
            client.MqttMsgPublishReceived += Client_MqttMsgPublishReceived;

            //釋出消息
            String content = "{'content':'msg from :" + mqttClientId + ", 這裡是.NET裝置'}";
            var id = client.Publish(PubTopic, Encoding.ASCII.GetBytes(content));

            //訂閱消息
            client.Subscribe(new string[] { SubTopic }, new byte[] { 0 });
        }

        static void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            // handle message received
            string topic = e.Topic;
            string message = Encoding.ASCII.GetString(e.Message);
        }

    }
}           

4. 運作結果

雲端看到裝置上線記錄,資料上報記錄

.NET平台裝置使用C#語言接入阿裡雲IoT

至此,完成了.NET平台裝置C#語言接入阿裡雲IoT物聯網雲平台的開發實踐

.NET平台裝置使用C#語言接入阿裡雲IoT

繼續閱讀