天天看點

阿裡雲物聯網 .NET Core 用戶端 | CZGL.AliIoTClient:1. 連接配接阿裡雲物聯網

1) 阿裡雲物聯網

阿裡雲物聯網支援多種通訊協定,CZGL.AliIoTClient 使用了 MQTT 通訊協定,通訊庫為 M2MQTT 。

阿裡雲物聯網資料傳輸有兩種資料傳輸方式,分别是 透傳 和 Alink json,兩種方式隻在屬性讀/寫、事件上報、服務調用這四種 Topic 上有差異, 其它連接配接通訊、普通 Topic、響應等,無差别。建議使用 Alink json 方式上傳下發資料。

傳輸形式 本質 說明
Alink json json 需按照阿裡雲物聯網文檔配置 json
透傳 二進制 在使用屬性、事件和服務功能時,資料為二進制,有具體的傳輸位要求

CZGL.AliIoTClient 支援 Alink json 和 透傳,SDK 中有兩個用戶端類,

AliIoTClientJson 以Alink json為傳輸形式的用戶端
AliIoTClientBinary: 以二進制為傳輸形式的用戶端

兩者很大程度上是一緻的,僅在屬性事件服務方面的資料傳輸形式有差異。是以後面主要以 AliIoTClientJson 來說明。

2) 連接配接到阿裡雲IOT

2.1) 建立用戶端

在建立用戶端類時,需要傳入 DeviceOptions 對象,需要預先在阿裡雲物聯網控制台,複制裝置的密鑰等資訊,填入到 DeviceOptions 中。

示例:

AliIoTClientJson client = new AliIoTClientJson(new DeviceOptions

{
            ProductKey = "a1xrkGSkb5R",
            DeviceName = "mire",
            DeviceSecret = "CqGMkOBDiKJfrOWp1evLZC2O6fsMtEXw",
            RegionId = "cn-shanghai"
        });           

2.2) 設定要訂閱的 Topic

連接配接用戶端前,應當設定需要訂閱的普通 Topic 以及配置是否接收屬性設定指令、服務調用和響應等 Topic 。

普通topic

設定要訂閱的普通 Topic:

string[] topics = new string[] { ... , ... , ... };

要求填寫 Topic 完整的長度的 URI ,可到控制台中檢視。例如 "/a1xrkGSkb5R/dockertest/user/update/error"

如果你不想這麼麻煩,可以使用

string[] topics = new string[] { client.CombineHeadTopic("get") };

隻需輸入 Topic 的 /user/ 後面的内容即可,AliIoTClientJson.CombineHeadTopic() 會為你生成完整的 Topic 位址。 例如需要訂閱 "/a1xrkGSkb5R/dockertest/user/update/error"

string[] topics = new string[] { client.CombineHeadTopic("update/error") };

除了普通的 Topic 外,還要裝置上傳各種資料、接收伺服器的響應、伺服器設定裝置屬性、伺服器調用裝置服務等,這些将在後面章節介紹。

3) 設定預設事件

你希望在收到消息時,程式需要做點什麼?編寫相應的方法,綁定到委托事件中,當條件符合時,這些方法将會被觸發。

在本章,使用 CZGL.AliIoTClient 預設定的預設委托方法,後面章節将會詳細說明如何自定義方法。

使用預設事件:

client.UseDefaultEventHandler();
           

4) 用戶端連接配接

已經做好了連接配接前的配置工作,現在連接配接到阿裡雲物聯網。

CZGL.AliIoTClient 中,有三個關于連接配接的方法:

方法
AliIoTClientJson.ConnectIoT(string[], byte[], ushort) 連接配接到阿裡雲物聯網伺服器
AliIoTClientJson.ConnectIoTAsync(string[], byte[], ushort) 使用異步方法連接配接到阿裡雲物聯網伺服器
AliIoTClientJson.ConnectIoTClose() 關閉、釋放用戶端

5) 示例

在阿裡雲物聯網控制台建立一個産品,再在此産品下建立一個裝置,其它功能不需要添加。記錄下建立裝置的密鑰等資訊。

在 Visual Studio 中,建立一個 .NET Core 控制台應用,在 Nuget 中找到 CZGL.AliIoTClient 并添加。 控制台代碼如下:

// 建立用戶端

client = new AliIoTClientJson(new DeviceOptions
        {
            ProductKey = "a1xrkGSkb5R",
            DeviceName = "mire",
            DeviceSecret = "CqGMkOBDiKJfrOWp1evLZC2O6fsMtEXw",
            RegionId = "cn-shanghai"
        });

        // 設定要訂閱的Topic、運作接收内容的Topic
        string[] topics = new string[] { client.CombineHeadTopic("get") };
        // 使用預設事件
        client.UseDefaultEventHandler();
        // 連接配接伺服器
        client.ConnectIoT(topics,null,60);
        Console.ReadKey();           

打開阿裡雲物聯網控制台,重新整理裝置清單,即可看到裝置線上。

6) 下發資料

一個建立的産品,有幾個預設的 Topic ,我們不必作其它修改,就目前來說,可以使用預設的 Topic 做示範。

運作上面已經編寫好的控制台程式,不要關閉。

打開阿裡雲物聯網控制台,打開相應的裝置,在裝置的 Topic清單 裡面找到 .../user/get 這個 Topic, 例如: /a1xrkGSkb5R/dockertest/user/get

點選 釋出消息 ,然後輸入要發送的内容,最後檢視控制台是否收到下發的消息。

由于使用了 CZGL.AliIoTClient 中,預設的事件方法,是以除了消息内容,也會輸出這條 Topic 消息的一些屬性資訊。

7) 上傳資料

裝置的 Topic 清單,有個 .../user/update ,例如 /a1xrkGSkb5R/dockertest/user/update 。 這個 Topic 允許用戶端上傳資料,下面将說明用戶端如何上傳資料到阿裡雲物聯網伺服器。

上傳普通 Topic 的方法:

I. 上傳 byte

public int CommonToServer(string topicName, byte[] content)

摘要:

此種方式以 byte[] 形式上傳資料,注意 byte[] 的進制

參數: topicName: Topic 的完整名稱,可使用 CombineHeadTopic() 方法擷取 content: 消息内容

傳回結果: 消息 ID

II. 普通字元串

public int CommonToServer(string topicName, string content)

摘要: 普通方式推送 Topic 到伺服器,直接上傳字元串

III. 其它上傳方法

還要其它幾個方法,放到一起說明。

public int CommonToServer(string topicName, string content,

[System.Text.Encoding encoding = null])           

說明:上傳資料到指定 Topic ,指定字元串的編碼格式。阿裡雲物聯網預設使用 UTF8。

CZGL.AliIoTClient 也預設使用 UTF8 作為資料的編碼,可以自定義上傳字元串的編碼。 一般不需要改,不然中文字元串會亂碼。

public int CommonToServerBase64(string topicName, string content)

說明:傳入字元串後,會先進行 Base64 編碼,然後再上傳。

public int CommonToServerBase64(string topicName,

string content, 
                            [System.Text.Encoding encoding = null])           

說明:傳入字元串後,指定字元串的編碼,然後進行 Base64 編碼後上傳。

8) 建立Topic

你可以在阿裡雲物聯網控制台打開某個産品,在産品裡建立一個或多個 Topic ,設定這個 Topic 具有 訂閱/釋出 權限。 然後修改程式試試是否正常上傳、下發資料。

繼續閱讀