# IoT
**Repository Path**: ping9719/IoT
## Basic Information
- **Project Name**: IoT
- **Description**: 物联网设备通讯协议实现,包括主流PLC、ModBus、CIP、MC、FINS......等常用协议。(Iot device communication protocol implementation, including mainstream PLC, ModBus, CIP, MC, FINS...... Such common protocols.)
- **Primary Language**: C#
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 35
- **Forks**: 15
- **Created**: 2025-03-12
- **Last Updated**: 2025-09-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## Ping9719.IoT
工业互联网通讯库协议实现,包括主流协议:ModBus、S7、CIP、MC、FINS......等常用协议和PLC。可通过不同的方式:TCP、UDP、MQTT、USB、蓝牙...等进行简易方便的交换数据。
## 语言选择:
[简体中文](README.md) || [English](README_en-US.md)
## 仓库:
主库([Github](https://github.com/ping9719/IoT));备库([Gitee](https://gitee.com/ping9719/IoT))
## 项目:
| 项目 | 支持 | 文档 | 版本 |依赖 |包名(NuGet) |
|----------|----------------------------|-----------------------------------------------|----------------------------------------------|----------------------|-----------------------------|
| [Ping9719.IoT](#IoT) | net45;netstandard2.0 | [文档](Ping9719.IoT/docs/README.md) |[文档](Ping9719.IoT/docs/VERSION.md) | System.IO.Ports |Ping9719.IoT |
| [Ping9719.IoT.Hid](#Hid) | net45;netstandard2.0 | [文档](Ping9719.IoT.Hid/docs/README.md) |[文档](Ping9719.IoT.Hid/docs/VERSION.md) | IoT;HidSharp |Ping9719.IoT.Hid |
| [Ping9719.IoT.WPF](#WPF) | net45;net8.0-windows | [文档](Ping9719.IoT.WPF/docs/README.md) |[文档](Ping9719.IoT.WPF/docs/VERSION.md) | IoT; |Ping9719.IoT.WPF (暂未发布) |
| [Ping9719.IoT.Avalonia](#Avalonia) | net8.0;netstandard2.0 | [文档](Ping9719.IoT.Avalonia/docs/README.md) |[文档](Ping9719.IoT.Avalonia/docs/VERSION.md) | IoT;Avalonia |Ping9719.IoT.Avalonia (暂未发布) |
### Ping9719.IoT
>跨平台的库。
基础:接口定义,返回类型定义...
通信:TCP,UDP,串口...
协议:ModBus,MC,FINS...
算法:CRC,LRC...
设备:RFID,扫码枪...
### Ping9719.IoT.Hid
>跨平台链接库。
对IoT进行的扩充,支持在windows、安卓、苹果的手机、平板、电脑上进行USB和蓝牙发送和接收数据
### Ping9719.IoT.WPF
>在windows平台上的界面UI库。
提供众多方便可直接使用的控件可快速调试IoT中的各种协议和设备
### Ping9719.IoT.Avalonia
>跨平台的界面UI库。
提供众多方便可直接使用的控件可快速调试IoT中的各种协议和设备
## 如何安装包

## 前言、入门、亮点
1.常用协议实现 `IReadWrite`,可通过泛型方式进行读或写。
```CSharp
client.Read("abc");//读1个
client.Read("abc", 5);//读5个
client.Write("abc", true);//写1个
client.Write("abc", new int[] { 10, 20, 30 });//写多个
```
2.所有客户端协议可快速的切换为不同的方式,比如从`TCP`切换为`USB`
> 这里以`ModbusRtu`举列,默认只支持串口。但是如果你想实现`ModbusRtuOverTcpClient`(使用TCP的方式走`ModbusRtu`协议)其他的都是同理。
```CSharp
var serialPortClient = new SerialPortClient("COM1", 9600);
var tcpClient = new TcpClient("127.0.0.1", 502);
var usbHidClient = new UsbHidClient(UsbHidClient.GetNames[0]);
var client0 = new ModbusRtuClient(serialPortClient);//使用串口方式,默认
var client1 = new ModbusRtuClient(tcpClient);//使用Tcp方式,ModbusRtuOverTcpClient
var client2 = new ModbusRtuClient(usbHidClient);//使用Usb方式,ModbusRtuOverUsbClient
client0.Client.Open();//打开
```
3.客户端`ClientBase`包含丰富的功能,且代码一致性高。
【提示】以下代码所有通用,包含 `TcpClient`、`SerialPortClient`、`UsbHidClient` 等...
```CSharp
ClientBase client1 = new TcpClient("127.0.0.1", 502);//Tcp方式
client1.Encoding = Encoding.UTF8;
//1:连接模式。断线重连使用得比较多
client1.ConnectionMode = ConnectionMode.Manual;//手动。需要自己去打开和关闭,此方式比较灵活。
client1.ConnectionMode = ConnectionMode.AutoOpen;//自动打开。没有执行Open()时每次发送和接收会自动打开和关闭,比较合适需要短链接的场景,如需要临时的长链接也可以调用Open()后在Close()。
client1.ConnectionMode = ConnectionMode.AutoReconnection;//自动断线重连。在执行了Open()后,如果检测到断开后会自动打开,比较合适需要长链接的场景。调用Close()将不再重连。
//2:接收模式。以您以为的最好的方式来处理粘包问题
client1.ReceiveMode = ReceiveMode.ParseByteAll();
client1.ReceiveModeReceived = ReceiveMode.ParseByteAll();
//3:数据处理器。可在发送时加入换行,接收时去掉换行,也可自定义
client1.SendDataProcessors.Add(new EndAddValueDataProcessor("\r\n", client1.Encoding));
client1.ReceivedDataProcessors.Add(new EndClearValueDataProcessor("\r\n", client1.Encoding));
//4:事件驱动。
client1.Opened = (a) => { Console.WriteLine("链接成功。"); };
client1.Closed = (a, b) => { Console.WriteLine($"关闭成功。{(b ? "手动断开" : "自动断开")}"); };
client1.Received = (a, b) => { Console.WriteLine($"收到消息:{a.Encoding.GetString(b)}"); };
client1.Open();//打开,在打开前处理属性和事件
//5:简单的发送、接收和发送等待操作。
client1.Send("abc");//发送
client1.Receive();//接收
client1.Receive(3000);//接收,3秒超时
client1.Receive(ReceiveMode.ParseToEnd("\n", 3000));//接收\n字符串结尾的,超时为3秒
client1.SendReceive("abc", 3000);//发送并等待接收数据,3秒超时
client1.SendReceive("abc", ReceiveMode.ParseToEnd("\n", 3000));//发送并接收\n字符串结尾的,超时为3秒
```
4.返回类型统一为 `IoTResult`,不需要在单独使用`Try`来处理异常信息。
> `IoTResult`包含`Value`,`IoTResult`不包含
```CSharp
var info = client.Read("abc");
if (info.IsSucceed)//应判断后在取值
var val = info.Value;
else
var err = info.ErrorText;
```