主頁 > .NET開發 > 基于華為物聯網IOT的應用開發 --- 基于.net 的SDK封裝

基于華為物聯網IOT的應用開發 --- 基于.net 的SDK封裝

2020-09-24 01:09:18 .NET開發

最近,物聯網的概念比較熱門,一大批廠商搶著占領物聯網的高低,包括有華為物聯網、阿里云物聯網、騰訊物聯網、AWS物聯網等等,無法一一列舉,一般物聯網包含設備側開發、平臺側開發、應用側開發,三個部分構成了線上線下的完整連接,和我們常規的微信應用、釘釘應用等不同,物聯網的終端是由各種各樣的設備組合而成,這些設備通過各種不同的協議(如CoAP,LWM2M、MQTT)連接到IOT的平臺,而且這些設備是低能耗的設備,可以實時的發送資料上來,也可以接受來自IOT平臺下發的各種操作指令,本篇隨筆主要介紹基于華為物聯網IOT的應用開發,實作對.net SDK的封裝,方便后期進行應用集成使用,

1、物聯網的相關介紹

物聯網其實有點類似我們以前做的一些行業設備的接入,不過它相對比較通用化一些,可以連接各種各樣的型別設備,而且更加安全、低能耗等,我們以前接入很多設備,可能需要走TCP/UDP協議,然后在后臺服務器有一個對這些設備管理的一個Socket服務器,不過和物聯網對比,這些都被徹底改造過了,以便適應更多的 應用場景,更簡化的開發,以及支持更強大的功能吧,

物聯網目前可以針對一些傳感器采集一些特定的引數,如光感、溫度、濕度、壓力、電壓、電流等常規的資訊,也可以擴展實作語音、影像、視頻等方面的采集處理,如經典的智慧路燈應用場景,

下面是其中的一個應用的架構設計,主要就是針對這些設備管理,物聯網還提供了很多完善的應用API介面,使得我們可以更加簡化對設備的管理(不用架設Socket服務),更加方便的通過API獲取相應的資訊,節省更多的維護成本,

 

物聯網平臺支持海量設備連接上云,設備與云端可以實作穩定可靠地雙向通信,

  • 提供設備端SDK、驅動、軟體包等幫助不同設備、網關輕松接入物聯網云,
  • 提供2G/ 3G /4G、NB-IoT、LoRa、WiFi等不同網路設備接入方案,解決企業異構網路設備接入管理痛點,
  • 提供MQTT、CoAP、HTTP/S等多種協議的設備端SDK,既滿足長連接的實時性需求,也滿足短連接的低功耗需求,
  • 開源多種平臺設備端代碼,提供跨平臺移植指導,賦能企業基于多種平臺做設備接入,

一般的物聯網平臺,都會包括產品管理、設備管理、設備組管理、規則引擎管理、訊息推送和訊息訂閱、任務管理、設備升級等等,不同的物聯網云平臺有所不同,

 

物聯網的幾個相關的協議:

MQTT(Message Queue Telemetry Transport)

MQTT是一個物聯網傳輸協議,被設計用于輕量級的發布/訂閱式訊息傳輸,旨在為低帶寬和不穩定的網路環境中的物聯網設備提供可靠的網路服務,

MQTTS指MQTT+SSL/TLS,在MQTTS中使用SSL/TLS協議進行加密傳輸,

 

CoAP(Constrained Application Protocol)

受約束的應用協議(CoAP)是一種軟體協議,旨在使非常簡單的電子設備能夠在互聯網上進行互動式通信,

CoAPS指CoAP over DTLS,在CoAPS中使用DTLS協議進行加密傳輸,

 

LWM2M(lightweight Machine to Machine)

LWM2M是由OMA(Open Mobile Alliance)定義的物聯網協議,主要使用在資源受限(包括存盤、功耗等)的NB-IoT終端

 

2、應用側開發介面

應用側的開發介面一般云平臺都會提供不同平臺的SDK,如阿里云開源提供Java SDK/C# SDK等;而華為則提供了Java、PHP等SDK,沒有包含.net 的SDK,

阿里物聯網云的應用側API介面包括:

 華為物聯網云的應用側API介面包括:

 

 本篇主要介紹最基礎的物聯網SDK的包裝,以方便后續的應用開發集成,本篇隨筆也主要是基于華為應用側API的封裝,使用C#語言實作對.net SDK的全部封裝處理,

 針對上面的介面分類,我們定義不同的介面類來處理它們,

基本上所有API訪問都先需要通過鑒權介面獲取訪問的token,鑒權介面定義如下所示,

而且華為的API介面,需要使用X509證書處理的,我們可以通過在官網下載對應的X509證書進行集成測驗API,

為了實作對API進行的.net SDK封裝,我們定義一些系統常見變數,方便在介面中使用,

 

 根據鑒權回傳的結果,我們定義一個對應的物體類來存盤這些屬性資訊,如下所示,

    /// <summary>
    /// 鑒權結果
    /// </summary>
    public class AuthenticationResult : BaseJsonResult
    {
        /// <summary>
        /// 申請權限范圍,即accessToken所能訪問物聯網平臺資源的范圍,引數值固定為default,
        /// </summary>
        public string scope { get; set; }

        /// <summary>
        /// accessToken的型別,引數值固定為Bearer ,
        /// </summary>
        public string tokenType { get; set; }

        /// <summary>
        /// accessToken的有效時間,引數值固定為3600秒
        /// </summary>
        public int expiresIn { get; set; }

        /// <summary>
        /// 鑒權引數,訪問物聯網平臺API介面的憑證,
        /// </summary>
        public string accessToken { get; set; }

        /// <summary>
        /// 鑒權引數,有效時間為1個月,用于“重繪Token”介面,
        /// 當accessToken即將過期時,可通過“重繪Token”介面來獲取新的accessToken,
        /// </summary>
        public string refreshToken { get; set; }
    }

然后根據鑒權定義,我們實作對這個介面的封裝處理,

    /// <summary>
    /// IOT鑒權介面實作
    /// </summary>
    public class AuthenticationApi : IAuthenticationApi
    {
        /// <summary>
        /// 用戶鑒權
        /// 應用服務器首次訪問物聯網平臺的開放API時,需呼叫此介面完成接入認證;
        /// 應用服務器在物聯網平臺的認證過期后,需呼叫此介面重新進行認證,才能繼續訪問物聯網平臺的開放API,
        /// </summary>
        public AuthenticationResult Authentication()
        {
            string postData = https://www.cnblogs.com/wuhuacong/p/string.Format("appId={0}&secret={1}", Constants.AppId, Constants.Secret);
            var url = Constants.AppBaseUrl + "/iocm/app/sec/v1.1.0/login";//名稱大小寫不能錯

            HttpHelper helper = new HttpHelper();
            helper.ContentType = "application/x-www-form-urlencoded";
            helper.ClientCertificates = new X509CertificateCollection() { new X509Certificate2(Constants.CertFilePath, Constants.CertPassword) };

            string content = helper.GetHtml(url, postData, true);
            var result = JsonConvert.DeserializeObject<AuthenticationResult>(content);
            return result;
        }

對于Token的重繪操作,封裝也是類似操作

        /// <summary>
        /// 重繪token,
        /// 應用服務器通過鑒權介面獲取到的accessToken是有有效時間的,在accessToken快過期時,
        /// 應用服務器通過呼叫此介面,獲取新的accessToken,
        /// </summary>
        /// <param name="refreshToken">
        /// 重繪token,用來獲取一個新的accessToken,refreshToken在呼叫鑒權介面或重繪token介面時獲得,
        /// </param>
        /// <returns></returns>
        public AuthenticationResult RefreshToken(string refreshToken)
        {
            string postData = https://www.cnblogs.com/wuhuacong/p/new
            {
                appId = Constants.AppId,
                secret = Constants.Secret,
                refreshToken = refreshToken
            }.ToJson();
            var url = Constants.AppBaseUrl + "/iocm/app/sec/v1.1.0/refreshToken";//名稱大小寫不能錯

            var result = WeJsonHelper<AuthenticationResult>.ConvertJson(url, postData);
            return result;
        }

上面有些是為了方便操作,定義了一些公用類別庫,以減少代碼的重復,

一般除了鑒權外的所有的API,它們處理方式都類似的,都是以 application/json 格式進行互動,使用POST、PUT、GET、Delete操作方式實作對資料的處理,

而且它們都需要有固定的請求頭資訊,我們以設備注冊為例進行介紹,

 

一般我們可以通過一個函式封裝,對介面的頭部請求資訊進行設定,如下所示,

        /// <summary>
        /// 通用獲取頭部資訊
        /// </summary>
        /// <param name="accessToken">介面訪問口令</param>
        /// <returns></returns>
        protected NameValueCollection GetHeader(string accessToken)
        {
            var header = new NameValueCollection();
            header.Add(Constants.HEADER_APP_KEY, Constants.AppId);
            header.Add(Constants.HEADER_APP_AUTH, string.Format("Bearer {0}", accessToken));
            return header;
        }

然后在定義請求的JSON和回傳的JSON對應的物體類物件,封裝對應的API介面即可,

例如,我們注冊設備的介面封裝如下所示,

    /// <summary>
    /// 設備管理介面實作
    /// </summary>
    public class DeviceApi : BaseCommon, IDeviceApi
    {
        /// <summary>
        /// 注冊設備(驗證碼方式),
        /// 在設備接入物聯網平臺前,應用服務器需要呼叫此介面在物聯網平臺注冊設備,并設定設備的唯一標識(如IMEI),
        /// 在設備接入物聯網平臺時攜帶設備唯一標識,完成設備的接入認證,
        /// </summary>
        /// <param name="accessToken"></param>
        /// <param name="info"></param>
        /// <returns></returns>
        public RegDeviceResult RegisterDevice(string accessToken, RegDeviceJson info)
        {
            var header = GetHeader(accessToken);

            string postData =https://www.cnblogs.com/wuhuacong/p/ info.ToJson();
            var url = Constants.AppBaseUrl + "/iocm/app/reg/v1.1.0/deviceCredentials";//名稱大小寫不能錯
            url += string.Format("?appId={0}", Constants.AppId);

            var result = WeJsonHelper<RegDeviceResult>.ConvertJson(url, postData, header);
            return result;
        }
......

這里請求的資訊是 RegDeviceJson , 回傳資訊的類是RegDeviceResult ,我們依照API定義,實作對應的處理即可,

為了方便處理,我們可以把這些對應設備的物體類定義在一個檔案里面,如DeviceJson.cs里面,如下所示,這樣非常方便我們管理,

 

 其他業務范疇的Api也是如此封裝,不在一一贅述,

我們測驗的時候,可以建立一個單獨的Winform專案進行介面功能的測驗,也可以自己撰寫單元測驗代碼進行測驗,根據自己熟練程度選擇吧,

例如鑒權介面測驗代碼如下所示,我們可以看看輸出進行判斷是否正常作業,

        private void btnLogin_Click(object sender, EventArgs e)
        {
            var result = basicApi.Authentication();
            Console.WriteLine(result != null ? "accessToken:" + result.ToJson() : "獲取結果出錯");

            if (result != null)
            {
                var refreshResult = basicApi.RefreshToken(result.refreshToken);

                Console.WriteLine(refreshResult != null ? "accessToken:" + refreshResult.ToJson() : "獲取結果出錯");
                this.accessToken = refreshResult.accessToken;//記錄待用
            }
        }

設備注冊的功能測驗如下所示,

        private void btnRegDevice_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(accessToken))
            {
                MessageUtil.ShowTips("請先鑒權獲取AccessToken");
                return;
            }

            var deviceApi = new DeviceApi();
            var regDeviceInfo = new RegDeviceJson()
            {
                endUserId = "64bf5869-b271-4007-8db8-fab185e19c10",
                nodeId = "64bf5869-b271-4007-8db8-fab185e19c10",
                psk = "12345678",
                timeout = 0,
                verifyCode = "",
                deviceInfo = new DeviceJson()
                {
                    deviceType = "Smoke",
                    manufacturerId = "49ac78c99f3e453598c155870efe8bfc",
                    manufacturerName = "iqidi",
                    //與manufacturerId、manufacturerName、deviceType、model和protocolType系列引數二選一
                    //productId = "5d9bf49b6a018f02d04cae28",
                    model = "1001",
                    name = "NBSimulator",
                    imsi = "fafafasfasf",
                    mac = "testetst",
                    isSecurity = true.ToString().ToUpper(),
                    protocolType = "LWM2M",
                }
            };

            var regResult = deviceApi.RegisterDevice(accessToken, regDeviceInfo);
            Console.WriteLine(regResult != null ? regResult.ToJson() : "no regResult");
        }

另外對于事件的通知,我們一般是在應用端被動的進行相應的處理,因此需要對它們的訊息進行轉換和處理,

 

 針對以上的訊息通知,我們需要定義對應的訊息型別,然后進行判斷處理,

我們另起一個專案,然后定義對應給的事件接收處理,如下所示是一個統一的入口處理,

 

有了一個總入口,我們把對應通知的資訊轉換為對應的物體后,就可以進行記錄或者回應的處理了,

在后面我們接著開發應用功能的時候,這些對應的介面API就可以集成整合在我們的系統中了,

 

 以上就是對于華為物聯網IOT平臺應用側的API封裝處理的思路, 供大家參考交流,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/115453.html

標籤:C#

上一篇:設計模式之?狀態模式實戰

下一篇:房貸計算器代碼

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more