1. 準備工作
1.1 注冊阿裡雲賬号
使用淘寶賬号或手機号,開通阿裡雲賬号,并通過實名認證(可以用支付寶認證)
1.2 免費開通IoT物聯網套件
産品官網
https://www.aliyun.com/product/iot
1.3 軟體開發環境
- 語言 C#
- 工具 Visual Studio IDE
2. IoT平台雲端開發
2.1 建立基礎版産品
産品資訊
消息通信Topic
2.2 注冊裝置
擷取裝置身份三元組,ProductKey,DeviceName,DeviceSecret
3. 裝置端開發
3.1 IoT平台接入password簽名算法檔案
簽名規則參考
https://www.yuque.com/cloud-dev/iot-tech/mebm5gusing 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物聯網雲平台的開發實踐