驅動開發實戰之TcpClient

場景模擬

假設你有一批非標設備需要對接,你需要根據設備方提供的協議,為IoTGateway開發驅動,進行數據交互。

文章比較長也可以到官網會有更好的體驗,地址:

http://iotgateway.net/docs/iotgateway/driver/tcpclient

請先瀏覽上一篇驅動簡介

http://iotgateway.net/docs/iotgateway/driver/drvier

協議概述

對方提供了如下協議文檔:

設備作為TCPServer,端口6666?字節序:Little-Endian,即低地址存放低位

請求回復

需要你主動發起讀取請求:0x01 02 03 04?設備回復:0x08 01 41 D6 3D 71 1A 20

參數說明

  1. 總字節數

    (byte[0])即0x08:用于簡單的校驗

  2. 運行狀態

    (byte[1])即0x01:1為運行;其他為停止

  3. 設備溫度

    (byte[2]-byte[5])即0x41 D6 3D 71:單精度浮點數值26.78

  4. 電機轉速

    (byte[6]-byte[7])即0x1A 20:對應16進制無符號整型,倍率0.01值66.88

驅動開發

創建驅動項目

  1. 在解決方案->Drivers文件夾,右鍵添加->新建項目->C#類庫?7c040849bf82883f7fb59fe3bdf69e88.png

  2. 項目名DriverSimTcpClient,放在iotgateway\Plugins\Drivers路徑下?d908dbd43e5e2d9c4e4fe2f598e630fe.png

  3. 修改Class1SimTcpClient

  4. 雙擊項目,修改配置?21f1a4cc8347cf7032a294d40900712a.png

    iotgateway\Plugins\Drivers\DriverSimTcpClient\DriverSimTcpClient.csproj

    <Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net6.0</TargetFramework><OutputPath>../../../IoTGateway/bin/Debug/net6.0/drivers</OutputPath><CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable></PropertyGroup><ItemGroup><PackageReference Include="SimpleTCP.Core" Version="1.0.4" /></ItemGroup><ItemGroup><ProjectReference Include="..\..\PluginInterface\PluginInterface.csproj" /></ItemGroup>
    </Project>

說明:

OutputPath節點指定了生成項目的文件夾

SimpleTCP.Core是一個TCP客戶端庫(你也可以自己寫)

ProjectReference節點引用了PluginInterface項目

CopyLocalLockFileAssemblies節點可以確保你引用的nuget拷貝到driver文件夾下 :::

編寫項目代碼:

iotgateway\Plugins\Drivers\DriverSimTcpClient\SimTcpClient.cs

using PluginInterface;
using SimpleTCP;
using System;
using System.Text;
namespace DriverSimTcpClient
{[DriverSupported("SimTcpServerDevice")][DriverInfoAttribute("SimTcpClient", "V1.0.0", "Copyright iotgateway? 2022-06-04")]public class SimTcpClient : IDriver{/// <summary>/// tcp客戶端/// </summary>private SimpleTcpClient? client;/// <summary>/// 緩存最新的服務器返回的原始數據/// </summary>private byte[] latestRcvData;#region 配置參數[ConfigParameter("設備Id")]public Guid DeviceId { get; set; }[ConfigParameter("IP地址")]public string IpAddress { get; set; } = "127.0.0.1";[ConfigParameter("端口號")]public int Port { get; set; } = 6666;/// <summary>/// 為了演示枚舉類型在web端的錄入,這里沒用到 但是你可以拿到/// </summary>[ConfigParameter("連接類型")]public ConnectionType ConnectionType { get; set; } = ConnectionType.Long;[ConfigParameter("超時時間ms")]public int Timeout { get; set; } = 300;[ConfigParameter("最小通訊周期ms")]public uint MinPeriod { get; set; } = 3000;#endregionpublic SimTcpClient(Guid deviceId){DeviceId = deviceId;}/// <summary>/// 判斷連接狀態/// </summary>public bool IsConnected{get{//客戶端對象不為空并且客戶端已連接則返回truereturn client != null && client.TcpClient.Connected;}}/// <summary>/// 進行連接/// </summary>/// <returns>連接是否成功</returns>public bool Connect(){try{//進行連接client = new SimpleTcpClient().Connect(IpAddress, Port);client.DataReceived += Client_DataReceived;}catch (Exception){return false;}return IsConnected;}/// <summary>/// 收到服務端數據/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Client_DataReceived(object? sender, Message e){//如果收到的數據校驗正確,則放在內存中if (e.Data.Length == 8 && e.Data[0] == 0x08)latestRcvData = e.Data;}/// <summary>/// 斷開連接/// </summary>/// <returns>斷開是否成功</returns>public bool Close(){try{client.DataReceived -= Client_DataReceived;//斷開連接client?.Disconnect();return !IsConnected;}catch (Exception){return false;}}/// <summary>/// 釋放/// </summary>public void Dispose(){try{//釋放資源client?.Dispose();}catch (Exception){}}/// <summary>/// 發送數據/// </summary>private byte[] sendCmd = new byte[4] { 0x01, 0x02, 0x03, 0x04 };/// <summary>/// 解析并返回/// </summary>/// <param name="ioarg">ioarg.Address為起始變量字節編號;ioarg.ValueType為類型</param>/// <returns></returns>[Method("讀模擬設備數據", description: "讀模擬設備數據,開始字節和長度")]public DriverReturnValueModel Read(DriverAddressIoArgModel ioarg){var ret = new DriverReturnValueModel { StatusType = VaribaleStatusTypeEnum.Good };ushort startIndex;//判斷地址是否為整數if (!ushort.TryParse(ioarg.Address, out startIndex)){ret.StatusType = VaribaleStatusTypeEnum.Bad;ret.Message = "起始字節編號錯誤";return ret;}//連接正常則進行讀取if (IsConnected){try{//發送請求client?.Write(sendCmd);//等待恢復,這里可以優化Thread.Sleep(Timeout);if (latestRcvData == null){ret.StatusType = VaribaleStatusTypeEnum.Bad;ret.Message = "沒有收到數據";}else{//解析數據,并返回switch (ioarg.ValueType){case DataTypeEnum.UByte:case DataTypeEnum.Byte:ret.Value = latestRcvData[startIndex];break;case DataTypeEnum.Int16:var buffer16 = latestRcvData.Skip(startIndex).Take(2).ToArray();ret.Value = BitConverter.ToInt16(new byte[] { buffer16[0], buffer16[1] }, 0);break;case DataTypeEnum.Float://拿到有用的數據var buffer32 = latestRcvData.Skip(startIndex).Take(4).ToArray();//大小端轉換一下ret.Value = BitConverter.ToSingle(new byte[] { buffer32[3], buffer32[2], buffer32[1], buffer32[0] }, 0);break;default:break;}}}catch (Exception ex){ret.StatusType = VaribaleStatusTypeEnum.Bad;ret.Message = $"讀取失敗,{ex.Message}";}}else{ret.StatusType = VaribaleStatusTypeEnum.Bad;ret.Message = "連接失敗";}return ret;}public async Task<RpcResponse> WriteAsync(string RequestId, string Method, DriverAddressIoArgModel Ioarg){RpcResponse rpcResponse = new() { IsSuccess = false, Description = "設備驅動內未實現寫入功能" };return rpcResponse;}}public enum ConnectionType{Long,Short}
}

注冊驅動

  1. 生成DriverSimTcpClient?項目

    iotgateway\IoTGateway\bin\Debug\net6.0\drivers\net6.0路徑下可以看到生成了DriverSimTcpClient.dll

  2. 運行IoTGateway,訪問本地518端口

  3. 添加驅動

網關配置->驅動管理->添加

6e582cba306714982e65949ff3c7544e.png

注意:添加驅動后需要重啟一下項目,后面會優化

創建設備

采集配置->設備維護->添加設備

?a19152f349a35b6c859afc64080d8b54.png

添加變量

采集配置->設備維護->添加設備

手動添加或者通過excel批量導入下面變量

變量名方法地址類型表達式設備名
運行狀態Read1uint8
模擬設備
設備溫度Read2float
模擬設備
電機轉速Read6int16raw*0.01模擬設備

開始采集

采集配置->設備維護->編輯設備?cff95584ef6e2e4a7ba33dcabcb0dbb1.png

啟動TcpServer

運行你熟悉的TCPServer測試工具,啟動端口6666,網關客戶端連接后發送響應報文

6806f1df7841dede03934362b512265f.png

查看數據

75938eafdf47e8d4581d61ae85d7d298.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286442.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286442.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286442.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php讀取acc

<?PHP/*創建ADO連接*/$conn new COM("ADODB.Connection") or die ("ADO Connection faild.");$connstr "DRIVER{Microsoft Access Driver (*.mdb)}; DBQ" . realpath("DATUM/cnbt.mdb");$conn->Open($connstr);/*創建記錄集查…

【遙感數字圖像處理實驗】Erdas版詳細圖文實驗教程(8實驗全)

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 遙感數字圖像的處理&#xff0c;是對遙感數字圖像的計算機處理。與工業和醫學數字圖像不同&#xff0c;遙感數字圖像類型更為多樣&#xff0c;內容更為復雜。因此&#xff0c;遙感數字圖像的處理&#xff0c;不僅需要掌握…

WEBAPI 增加身份驗證 (OAUTH 2.0方式)

1&#xff0c;在Webapi項目下添加如下引用&#xff1a;Microsoft.AspNet.WebApi.OwinOwinMicrosoft.Owin.Host.SystemWebMicrosoft.Owin.Security.OAuthMicrosoft.Owin.Security.CookiesMicrosoft.AspNet.Identity.OwinMicrosoft.Owin.Cors2&#xff0c; 在項目下新建Startup類…

C語言試題二之計算并輸出下列多項式值s=1+1/(1+2)+1/(1+2+3)+..1/(1+2+3…+50)

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 計算并輸出…

無代碼iVX編程實現簡單 小蜜蜂 經典游戲

首先咱們打開 iVX 的在線編輯器&#xff1a;https://editor.ivx.cn/ 隨后選擇相對定位&#xff0c;咱們選擇2D游戲類型制作一個簡單小蜜蜂游戲&#xff1a; 接著咱們創建一個物理世界&#xff0c;并且將頁面布局如以下&#xff1a; 以上布局中&#xff0c;矩形為模擬飛機、…

【無人機航空攝影測量精品教程】目錄:Pix4d、EPS、CC、PhotoScan、Godwork項目化作業流程及注意事項匯總

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 該專欄為目前最為熱門的無人機航測內外業項目&#xff0c;主要內容包括&#xff1a;無人機航測外業作業流程&#xff08;像控點布設、航線規劃、仿地飛行、航拍&#xff09;和內業數據處理軟件&#xff08;Pix4d、CC、EP…

WPF 基礎控件之 Slider 樣式

其他基礎控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButton15.ToggleButtonSlider 實現下面的效果1&#xff09;Slider來實現動畫&#xff1b;Grid嵌套 Border并設置S…

SQL 通過syscolumns.xtype動態查找指定數據類型字段所包含的數據

表中太多列&#xff0c;只想查找某些比如&#xff0c;數據類型為varchar的字段的數據。 思路&#xff1a;1、先獲取列名&#xff1a; select * from syscolumns where id(select max(id) from sysobjects where xtypeu and nametest_A)2、查找指定數據類型&#xff0c;xtype就…

css案例學習之span邊框實現的特殊效果

bottom left bottom right top left top right 配合顏色來使用&#xff0c;實現一些神奇的效果 #menu a span{height:0;width:0;/*border-top:solid 6px #fff;border-left:solid 6px #f90;*//*border-top:solid 6px #fff;border-right:solid 6px #f90;*//*border-bottom:solid …

網頁版消消樂快速實現,無代碼嗎iVX 真那么簡單?

最近沒事想做個消消樂&#xff0c;然后聽說 iVX 免費了&#xff0c;所以又跑去看看 iVX 了&#xff0c;就用一個無代碼來看看消消樂怎么玩吧。 首先咱們打開 iVX 的在線編輯器&#xff1a;https://editor.ivx.cn/ 隨后咱們不需要游戲類型也可以制作一個消消樂游戲&#xff1a…

虛擬化記錄--No.1

近段時間&#xff0c;會花些時間做關于系統虛擬化的工作。所以會做一些這樣的記錄。相信很多東西不會特別成體系&#xff0c;每個人因為關注的不同而記錄和學習的重點也會有比較大的出入。這篇是NO.1(注意不是TOP 1 )真的是由于對于ORACLE很有感覺&#xff0c;所以上手去做的也…

C語言試題三之計算并輸出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1 、題目 請編寫函…

C# Java間進行RSA加密解密交互

這里&#xff0c;講一下RSA算法加解密在C#和Java之間交互的問題&#xff0c;這兩天糾結了很久&#xff0c;也看了很多其他人寫的文章&#xff0c;頗受裨益&#xff0c;但沒能解決我的實際問題&#xff0c;終于&#xff0c;還是被我搗鼓出來了。 首先&#xff0c;介紹一下寫這代…

【Microstation】三維建模基礎及軟件入門到精通實驗教程目錄

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 MicroStation是一款非常不錯的二維和三維設計軟件&#xff0c;由奔特力&#xff08;Bentley&#xff09;工程軟件系統有限公司開發的一款軟件。在CAD設計上該軟件是和AutoCAD是齊名的軟件&#xff0c;其專用的文件格式是…

無代碼iVX編程實現簡單魂斗羅

首先咱們打開 iVX 的在線編輯器&#xff1a;https://editor.ivx.cn/ 隨后咱們選擇2D游戲類型制作一個簡單魂斗羅游戲&#xff1a; 隨后咱們開始創建一個物理世界&#xff0c;不并且在物理世界之下創建一個一個圖片添加物體屬性&#xff0c;在物體屬性中更改對應的屬性內容&am…

【ArcGIS遇上Python】ArcGIS Python批處理入門到精通實用教程目錄

文章目錄1. 專欄簡介2. 專欄地址3. 專欄目錄1. 專欄簡介 Python語言是目前很火熱的語言&#xff0c;極大的促進了人工智能發展。你知道在ArcGIS中也會有python的身影嗎&#xff1f;事實上&#xff0c;在ArcGIS中使用Python會起到事半功倍的效果&#xff0c;大大提高工作效率&am…

Android之提示javax.net.ssl.SSLHandshakeException: Chain validation failed

1、問題 個別手機用OkDownload下載Bilibili網址視頻的時候下載失敗,但是大部分手機下載沒問題。 在繼承的DownloadListener4WithSpeed類的重寫taskEnd函數里面。 override fun taskEnd(task: DownloadTask, cause: EndCause, realCause: Exception?, taskSpeed: SpeedCalcu…

c# XML和實體類之間相互轉換(序列化和反序列化)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary>/// Xml序列化與反序列化/// </summary>public class XmlUtil {…

深入探究MinimalApi是如何在Swagger中展示的

前言之前看到技術群里有同學討論說對于MinimalApi能接入到Swagger中感到很神奇,加上Swagger的數據本身是支持OpenApi2.0和OpenApi3.0使得swagger.json成為了許多接口文檔管理工具的標準數據源。ASP.NET Core能夠輕松快速的集成Swagger得益于微軟對OpenApi的大力支持&#xff0c…

語句的輸入、輸出

一、C#基礎 1、項目后綴&#xff1a; .config——配置文件&#xff08;存放配置參數文件&#xff09; .csproj——項目文件&#xff08;管理文件項&#xff09; .sln——解決方案文件&#xff08;管理項目&#xff09; .cs——源文件&#xff08;程序代碼&#xff09; 2、函數四…