保存配置信息和获取配置信息代码类似,都是通过Socket连接发送一系列指令
/// <summary> /// 保存设备配置 /// </summary> /// <param name="setting">设备配置实体对象</param> /// <returns></returns> public bool SaveDeviceSetting(ReaderDeviceSetting setting) { bool result = true; using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); try { SaveDeviceSetting(socket, setting);//发送多条指令给设备来完成配置修改 } catch (Exception e) { message = e.Message; result = false; } socket.Close(); } return result; } /// <summary> /// 保存设备配置 /// </summary> /// <param name="socket"></param> /// <param name="setting"></param> /// <param name="ipEndPoint"></param> private void SaveDeviceSetting(Socket socket, ReaderDeviceSetting setting) { IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(setting.RemoteIPAddress ), 65535); string request = "L";//初始化需要发送的数据 byte[] buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(50); request = "SON" + setting.SubName + "|18";//保存设备用户名 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SDN" + setting.Name + "|19";//保存设备名称 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "STP" + setting.TransferProtocol + "|20";//保存传输协议 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SPN" + setting.RemotePort + "|21";//保存远程设备端口号 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SRM" + setting.RunMode + "|22";//保存工作模式 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SFC" + setting.fc + "|23";//保存fc buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SDT" + setting.dt + "|24";//保存dt buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SBR" + setting.br + "|25";//保存br buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SPR" + setting.pr + "|26";//保存pr buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SBB" + setting.bb + "|27";//保存bb buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SRC" + setting.rc + "|28";//保存rc buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SCM" + setting.ConnectionMode + "|29";//保存连接方式 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SCT" + setting.ConnectionTime + "|30";//保存连接时限 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SML" + setting.ml + "|31";//保存ml buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SMD" + setting.md + "|32";//保存md buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SDI" + setting.LocalIPAddress + "|33";//保存上报数据IP地址 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SDP" + setting.LocalPort + "|34";//保存上报数据端口号 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SGI" + setting.Gateway + "|35";//保存远程设备网关地址 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SNM" + setting.SubnetMask + "|36";//保存远程设备子网掩码 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "SIP" + setting.RemoteIPAddress + "|37";//保存远程设备IP地址 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(10); request = "E";//初始化需要发送的数据 buffer = Encoding.ASCII.GetBytes(request); socket.SendTo(buffer, ipEndPoint); Thread.Sleep(500); //request = "W" + setting.MAC;//保存远程设备MAC地址 //buffer = Encoding.ASCII.GetBytes(request); //socket.SendTo(buffer, ipEndPoint); //Thread.Sleep(100); //request = "L";//初始化需要发送的数据 //buffer = Encoding.ASCII.GetBytes(request); //socket.SendTo(buffer, ipEndPoint); //Thread.Sleep(50); }
修改之前建立的device_editConroller控制器,增加一个SubmitSave保存动作,修改后整体代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.Mvc; using System.Net; using Mvcms.Common.Net; namespace Mvcms.Web.Controllers.admin.IOT { public class device_editController: UI.Controllers.BaseManageController { public ActionResult Index() { string ipaddress = request.QueryString["ip"].Trim(); int port = request.QueryString["port"].ToInt(); IsPlugin = true; ReaderDeviceHelper helper = new ReaderDeviceHelper(); ReaderDeviceSetting model = helper.GetDeviceSetting(ipaddress, port); return View(GetViewName("/IOT/device_edit.cshtml"), model); } /// <summary> /// 保存设备配置 /// </summary> /// <returns></returns> public ActionResult SubmitSave() { string ipAddress = request.Form["IPAddress"].Trim(); System.Net.IPAddress ip = null; try { ip = System.Net.IPAddress.Parse(ipAddress); } catch { return JsDialog("设备IP地址无效!", false); } int port = request.Form["Port"].ToInt(); ReaderDeviceHelper helper = new ReaderDeviceHelper(); //需要获取设备配置信息,有几个参数文档未说明含义,需要原样保存回去 ReaderDeviceSetting setting = helper.GetDeviceSetting(ipAddress, port); if (setting == null) { return JsDialog("无法检测到要更新的设备,操作中止!", false); } setting.RemoteIPAddress = ipAddress; setting.RemotePort = port; setting.MAC = request.Form["MAC"].ToString(); setting.Name = request.Form["Name"].Trim(); setting.SubName = request.Form["SubName"].Trim(); setting.SubnetMask = request.Form["SubnetMask"].Trim(); setting.Gateway = request.Form["Gateway"].Trim(); setting.LocalIPAddress = request.Form["DestinationIP"].Trim(); setting.LocalPort = request.Form["DestinationPort"].ToInt(); setting.ConnectionMode = request.Form["ConnectionMode"].ToInt(); setting.ConnectionTime = request.Form["ConnectionTime"].ToInt(); setting.RunMode = request.Form["RunMode"].ToInt(); setting.TransferProtocol = request.Form["TransferProtocol"].ToInt(); try { ip = IPAddress.Parse(setting.SubnetMask); ip = IPAddress.Parse(setting.Gateway); ip = IPAddress.Parse(setting.LocalIPAddress); } catch { return JsDialog("存在不和法的IP地址,请修正", false); } if (!request.Success) { return JsDialog(request.HtmlMessage(), false); } if (helper.SaveDeviceSetting(setting)) { System.Threading.Thread.Sleep(1500);//阻塞1.5秒,等待设备准备就绪 return JscriptMsg("保存 " + setting.LocalIPAddress + " 设备配置成功!", "../device_list/index?wait=1500", true); } else { return JsDialog(ReaderDeviceHelper.Message, false); } } } }
注意事项:保存完成配置信息后,设备需要重启,如果立即搜索设备会搜索不到这个刚刚更新配置的设备,测试发现大约需要等待3秒时间,设备才能准备就绪,所以在返回的Url参数中增加一个wait参数并设定列表页控制器动作延迟3秒在执行搜索设备操作。
共有条评论 网友评论