代码框架搭建
前面我们已经搭建了.NET的环境,那么我们直接开始搭建局域网TCP服务器。
- 这里TCP服务器的搭建依赖的是一个.net的开源架构RRQM,是一款非常优秀的框架,高性能、高并发完全符合学习和生产的需求,项目地址:https://gitee.com/dotnetchina/RRQMSocket.大家可以去学习,这里就不介绍了,有详细的中文使用文档。
- 安装和使用
我们还是基于前两节使用过的工程,先获取NuGet的程序包,直接搜索rrqm安装
- 移植代码
参考官方的文档
直接将代码复制到程序里,移植完如下
using RRQMSocket;
using System;
using System.Device.Gpio;
using System.IO.Ports;
using System.Text;
using System.Threading;
namespace RaspberryTest
{
class Program
{
public static SerialPort serialPort1 = new();//注册串口
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
/*------------------------------------------GPIO设置-------------------------------------------*/
Console.WriteLine("Blinking LED. Press Ctrl+C to end.");
int pin = 27;
using var controller = new GpioController();
controller.OpenPin(pin, PinMode.Output); //输出模式
//controller.OpenPin(pin, PinMode.Input); //输入模式
bool ledOn = true;
/*------------------------------------------串口设置-------------------------------------------*/
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); //串口接受注册
string[] coms = SerialPort.GetPortNames();//获取串口号
for (int i = 0; i < coms.Length; i++)
{
Console.WriteLine(coms[i]);//打印出口号
}
serialPort1.PortName = "/dev/ttyAMA2"; //串口好,相当于Windows下的COM口
serialPort1.BaudRate = 115200; //波特率
serialPort1.Open(); //打开串口
/*--------------------------------------TCP服务器配置----------------------------------------*/
TcpService service = new TcpService();
service.Connecting += (client, e) => { };//有客户端正在连接
service.Connected += (client, e) => { };//有客户端连接
service.Disconnected += (client, e) => { };//有客户端断开连接
service.Received += (client, byteBlock, requestInfo) =>
{
//从客户端收到信息
string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
Console.WriteLine($"已从{client.ID}接收到信息:{mes}");//
client.Send(mes);//将收到的信息直接返回给发送方
//client.Send("id",mes);//将收到的信息返回给特定ID的客户端
//var clients = service.GetClients();
//foreach (var targetClient in clients)//将收到的信息返回给在线的所有客户端。
//{
// if (targetClient.ID != client.ID)
// {
// targetClient.Send(mes);
// }
//}
};
service.Setup(new RRQMConfig()//载入配置
.SetListenIPHosts(new IPHost[] { new IPHost("192.168.9.100:7789"), new IPHost(7790) })//同时监听两个地址
.SetMaxCount(10000)
.SetThreadCount(100))
.Start();//启动
while (true)
{
controller.Write(pin, ((ledOn) ? PinValue.High : PinValue.Low)); //控制输出电平
//controller.Read(pin); //读取输入电平
ledOn = !ledOn;
Thread.Sleep(1000);
serialPort1.Write("I'm OK!");
}
}
private static void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接受
{
Console.WriteLine(serialPort1.ReadExisting());//打印串口接收
}
}
}
2. 本机运行测试
可以先在本机测试,将上面的IP地址换为自己电脑的IP,然后运行,例如我的电脑IP是192.168.9.116
运行程序前注意将gpio设置和串口设置部分的代码注释掉,因为这部分是为树莓派设置的,在电脑上运行会出错。
注释while里面的东西,留下延时。
然后运行启动监听,使用网络助手连接,用网络助手发送数据,查看效果,可以让局域网的其他小伙伴一起连接测试效果。
这里说明局域网内简单的TCP服务器搭建成功了。
运行测试
- 上面本机测试完成就可以移植到树莓派上面了
- 移植前先将上面注释的GPIO设置与串口设置部分代码取消注释。
- 查看树莓派的局域网IP地址,更改代码
我的树莓派是192.168.9.100,你用的有线那么就是eth0的,注意网卡,更改完代码里的地址,就是这一节刚开始我贴的代码,然后右键项目重新生成。 - 和前两节一样,将工程目录下的net5.0文件夹传输到树莓派,在net5.0文件夹下开始运行。
dotnet RaspberryTest.dll
使用网络助手连接测试,注意测试电脑和树莓派在同一个局域网下面。
测试成功。这只是简单的示例,具体功能和项目生产中需要考虑其他的因素和业务逻辑。