# 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**: 41
- **Forks**: 16
- **Created**: 2025-03-12
- **Last Updated**: 2025-11-27
## 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

环境、包名:
| 项目 | 环境 |包名(NuGet) |
|-----------------------|-------------------------|----------------------|
| Ping9719.IoT | net45 ; netstandard2.0 |Ping9719.IoT |
| Ping9719.IoT.Hid | net45 ; netstandard2.0 |Ping9719.IoT.Hid |
| Ping9719.IoT.WPF | net45 ; net8.0-windows |Ping9719.IoT.WPF (暂未发布) |
| Ping9719.IoT.Avalonia | net8.0 ; netstandard2.0 |Ping9719.IoT.Avalonia (暂未发布) |
## 文档&介绍:
| 项目 | 文档 | 版本 | 介绍 |
|-----------------------|---------------------------------------------------|----------------------------------------------|----------------------------|
| Ping9719.IoT | [详细文档](Ping9719.IoT/docs/README.md) |[版本文档](Ping9719.IoT/docs/VERSION.md) | 跨平台的库。包含基础、通信(TCP,UDP,串口... )、协议(ModBus,MC,FINS... )、算法(CRC,LRC...)、设备控制|
| Ping9719.IoT.Hid | [详细文档](Ping9719.IoT.Hid/docs/README.md) |[版本文档](Ping9719.IoT.Hid/docs/VERSION.md) |跨平台库。对IoT进行的扩充,支持在windows、安卓、苹果的手机、平板、电脑上进行USB和蓝牙发送和接收数据 |
| Ping9719.IoT.WPF | [详细文档](Ping9719.IoT.WPF/docs/README.md) |[版本文档](Ping9719.IoT.WPF/docs/VERSION.md) |在windows平台上的界面UI库。提供众多方便可直接使用的控件可快速调试IoT中的各种协议和设备|
| Ping9719.IoT.Avalonia | [详细文档](Ping9719.IoT.Avalonia/docs/README.md) |[版本文档](Ping9719.IoT.Avalonia/docs/VERSION.md) |跨平台的界面UI库。提供众多方便可直接使用的控件可快速调试IoT中的各种协议和设备 |
## 项目亮点介绍:
> 这里是亮点项目介绍,不是详细文档!!!详细文档在上面的“文档&介绍”中。
> 假如你还是找不到,你可以点击:([跳转到文档&介绍](#Project))([跳转到IoT详细文档](Ping9719.IoT/docs/README.md))
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;
```