【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
之前我们讨论过,设备之间通讯的方式很多。但是,不知道大家有没有注意,前面谈到的这些通讯方式都需要上位机电脑和被控制的设备离的很近,如果两者之间的距离比较短,这个时候就要想想其他的办法了。而网络,就是可以帮助我们解决这一问题的有效工具之一。
和232相比较,网络最大的好处就是传输距离远,可以是有线、又可以无线。不仅如此,它还有内网和外网之分,如果是内网的设备,一般是处于保密和安全的需要;如果是外网,说明我们可以在很远的地方实现对设备、生产环境、作业系统的控制,这些都是很方便的。
当然,要用好网络的话,需要我们能够掌握TCP/IP的基本协议,比如什么是链路层、什么是MAC地址、什么是IP、什么是端口、什么是网关等等。不光这些,除了这些基础内容,我们还有必要了解HTTP、FTP、Telnet、SSH、SMTP这些常用协议。有了这些基础做铺垫,后面加上一定的设备协议,就可以实现对远程设备的实时访问了。
TCP/IP只是一个标准,它和编程语言、软件平台、关联设备没有什么关系,只要符合这个标准,就可以利用交换机、路由器实现数据的互通有无了。
1、应用者需要掌握的协议
目前如果只是应用,学习好IP和PORT的配置就可以了,常用的协议HTTP、FTP、Telnet最好也掌握一下。
2、TCP和UDP如何选择
TCP一般用在网络环境比较ok的场景,对于无线或者是网络比较糟糕的场景来说,最好使用UDP,通常来说问题也不大。
3、不想自己设计协议怎么处理
如果通讯的设备都是自己开发的,那么完全可以使用xmlrpc的形式来进行通信。即所有通信的数据都压缩成xml形式传输,传输之后再调用对应的callback函数即可。
4、第三方设备的协议
对于第三方设备,一般它们都会在官网或者github网上提供对应的sdk协议内容,我们只要拿到对应的代码,在作业平台上面编译、开发即可。这部分内容,最好自己不要开发。因为坦率来说,这部分工作应该由供应商来完成,此外就算帮供应商来完成了这部分内容的开发,对自己来讲,时间上面并不是一个划算的买卖。
5、开发方法
目前不管是Windows,还是Linux,不管是c#、c、c++、vb、golang、java等语言,每一种平台、每一种语言都可以自己开发网络程序的,如果没有合适的第三方开发包,那么自己用Raw API直接开发网络程序也是可以的。就c# wpf而言,如果直接用Raw API开发网络程序,本身也是可以的。
6、网络界面开发
为了验证网络开发的效果,大家可以自己编写一个界面、编写一些程序,验证是不是真的可以同网段通信、跨网段通信。此时可以先在自己的电脑上进行测试,用127.0.0.1来处理,没问题了之后,再去部署在不同的设备上去确认和验证,慢慢积累出自己的调试方法和开发经验。
假设我们编写了这样一个服务器程序的界面,它bind到特定的ip、特定的端口上面,单击按钮后就可以开始监听端口。这个时候,每连接一个客户进来,右侧的combobox就添加一个选项。客户发送的内容,也会在第二行的Textbox打印出来,如果需要发送消息,那么第三行输入内容,单击"发送消息"按钮即可。当然,复杂一点,要发送文件的话,也可以通过选择文件和发送文件的按钮,来完成这样的操作。
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp"
mc:Ignorable="d"
Title="ServerDemo" Height="350" Width="542">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="4*"/>
<RowDefinition Height="4*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" BorderBrush="Black" Margin="5" Text="{Binding Ip}" HorizontalContentAlignment="Left"/>
<Border Margin="5" Grid.Column="1" Grid.Row="0" CornerRadius="10" Background="CadetBlue">
<TextBox BorderBrush="Black" Text="{Binding Port,Mode=TwoWay}" HorizontalContentAlignment="Left"/>
</Border>
<Border Margin="5" Grid.Column="2" Grid.Row="0" CornerRadius="10" Background="CadetBlue">
<Button BorderBrush="Black" Content="开始监听" Command="{Binding StartListen}"/>
</Border>
<Border Margin="5" Grid.Column="3" Grid.Row="0" CornerRadius="10" Background="CadetBlue">
<Button BorderBrush="Black" Content="停止监听" Command="{Binding StopListen}"/>
</Border>
<Border Margin="5" Grid.Column="4" Grid.Row="0" CornerRadius="10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="连接的客户:" VerticalAlignment="Center" TextAlignment="Center"/>
<ComboBox Width="80" ItemsSource="{Binding DicSocket,Mode=TwoWay}" SelectedValuePath="ItemSocket" DisplayMemberPath="ip"
SelectedValue="{Binding SelectSocket,Mode=TwoWay}" />
</StackPanel>
</Border>
<TextBox Grid.Row="1" Grid.ColumnSpan="5" Background="LightSlateGray"
BorderBrush="Black" Margin="5" Text="{Binding LogReceive}" VerticalScrollBarVisibility="Visible"/>
<TextBox Grid.Row="2" Grid.ColumnSpan="5" Background="LightSlateGray"
BorderBrush="Black" Margin="5" Text="{Binding Sendtext}" VerticalScrollBarVisibility="Visible"/>
<Border Margin="5" Grid.ColumnSpan="2" Grid.Row="3" CornerRadius="10" Background="CadetBlue">
<TextBox BorderBrush="Black" Text="{Binding SelectFile,Mode=TwoWay}"/>
</Border>
<Border Grid.Column="2" Grid.ColumnSpan="4" Grid.Row="3" CornerRadius="5" Background="White">
<StackPanel Orientation="Horizontal" >
<Grid Width="323">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Content="选择文件" Margin="5" Grid.Column="0" Command="{Binding SelectCommand}"/>
<Button Content="发送文件" Margin="5" Grid.Column="1" Command="{Binding SendFileCommand}"/>
<Button Content="发送消息" Margin="5" Grid.Column="2" Command="{Binding SendMessageCommand}"/>
</Grid>
</StackPanel>
</Border>
</Grid>
</Window>
7、剩余的工作
仅仅有server端的程序,这个软件是没有办法顺利工作的。大家可以参考server端界面的写法,编写一个client端的界面和程序,这样就可以实现client-server的数据通信了。