private static void ScanPorts(object o, bool b) { if(Interlocked.Exchange(ref _scanBusy, 1)!=0) { return; } byte[] buf=new byte[64]; byte[] tmpBuf=new byte[64]; byte[] disconnectAll=(new MsDisconnect()).GetBytes(); bool escChar; int cnt=0, tryCnt; SerialPort port=null; int length; bool found; List<string> pns=new List<string>(); Topic dev=Topic.root.Get("/dev"); lock(dev) { var ifs=dev.children.Where(z => z.valueType==typeof(MsDevice)).Cast<DVar<MsDevice>>().Where(z => z.value!=null).Select(z => z.value).ToArray(); foreach(var devSer in ifs) { cnt++; if(devSer.state==State.Connected) { continue; } if(string.IsNullOrWhiteSpace(devSer.via)) { _scanAllPorts=true; break; } string via=devSer.via; if(via!="offline" && !pns.Exists(z => string.Equals(z, via, StringComparison.InvariantCultureIgnoreCase))) { pns.Add(via); } } } if(_scanAllPorts || cnt==0) { _scanAllPorts=false; pns.Clear(); pns.AddRange(SerialPort.GetPortNames()); } else { pns=pns.Intersect(SerialPort.GetPortNames()).ToList(); } Topic tmp; if(Topic.root.Exist("/local/cfg/MQTT-SN.Serial/whitelist", out tmp)) { var whl=tmp as DVar<string>; if(whl!=null && !string.IsNullOrEmpty(whl.value)) { var wps=whl.value.Split(';', ','); if(wps!=null && wps.Length>0) { pns=pns.Intersect(wps).ToList(); } } } if(Topic.root.Exist("/local/cfg/MQTT-SN.Serial/blacklist", out tmp)) { var bll=tmp as DVar<string>; if(bll!=null && !string.IsNullOrEmpty(bll.value)) { var bps=bll.value.Split(';', ','); if(bps!=null && bps.Length>0) { pns=pns.Except(bps).ToList(); } } } for(int i=0; i<pns.Count; i++) { if(_gates.Exists(z => z.name==pns[i])) { continue; } try { port=new SerialPort(pns[i], 38400, Parity.None, 8, StopBits.One); port.ReadBufferSize=300; port.WriteBufferSize=300; port.Open(); port.DiscardInBuffer(); SendRaw(port, disconnectAll, tmpBuf); // Send Disconnect Thread.Sleep(500); cnt=-1; tryCnt=6; escChar=false; length=-1; found=false; while(--tryCnt>0) { if(GetPacket(port, ref length, buf, ref cnt, ref escChar)) { var msgTyp=(MsMessageType)(buf[0]>1?buf[1]:buf[3]); if(msgTyp==MsMessageType.SEARCHGW || msgTyp==MsMessageType.DHCP_REQ) { // Received Ack found=true; MsGSerial gw; lock(_gates) { gw=new MsGSerial(port); _gates.Add(gw); } MsDevice.ProcessInPacket(gw, gw._gateAddr, buf, 0, cnt); break; } else if(_verbose.value) { Log.Debug("r {0}: {1} {2}", pns[i], BitConverter.ToString(buf, 0, cnt), msgTyp); } SendRaw(port, disconnectAll, tmpBuf); // Send Disconnect } Thread.Sleep(90); } if(!found) { port.Close(); continue; } } catch(Exception ex) { if(_verbose.value) { Log.Debug("MQTTS.Serial search on {0} - {1}", pns[i], ex.Message); } try { if(port!=null) { if(port!=null && port.IsOpen) { port.Close(); } port.Dispose(); } } catch(Exception) { } } port=null; } _scanBusy=0; }
private static void ScanPorts(object o, bool b) { if(Interlocked.Exchange(ref _scanBusy, 1)!=0) { return; } byte[] buf=new byte[64]; byte[] searchGW=new byte[] { 0x03, 0x01, 0x00 }; byte addr=0xFF; bool escChar; int cnt=0, tryCnt; SerialPort port=null; byte[] curAddr; List<string> pns=new List<string>(); Topic dev=Topic.root.Get("/dev"); lock(dev) { var ifs=dev.children.Where(z => z.valueType==typeof(MsDevice)).Cast<DVar<MsDevice>>().Where(z => z.value!=null).Select(z => z.value).ToArray(); foreach(var devSer in ifs) { cnt++; if(devSer.state==State.Connected) { continue; } if(string.IsNullOrWhiteSpace(devSer.via)) { _scanAllPorts=true; break; } string via=devSer.via; if(via!="offline" && !pns.Exists(z => string.Equals(z, via, StringComparison.InvariantCultureIgnoreCase))) { pns.Add(via); } } } if(_scanAllPorts || cnt==0) { _scanAllPorts=false; pns.Clear(); pns.AddRange(SerialPort.GetPortNames()); } else { pns=pns.Intersect(SerialPort.GetPortNames()).ToList(); } for(int i=0; i<pns.Count; i++) { try { port=new SerialPort(pns[i], 38400, Parity.None, 8, StopBits.One); port.ReadBufferSize=300; port.WriteBufferSize=300; port.Open(); port.DiscardInBuffer(); SendRaw(port, 0, searchGW); // Send SearchGW Thread.Sleep(70); cnt=-1; tryCnt=5; escChar=false; curAddr=null; while(--tryCnt>0) { if(GetPacket(port, ref addr, buf, ref cnt, ref escChar)) { if(_verbose.value) Log.Debug("{0} r {1:X2}:{2}", pns[i], addr, BitConverter.ToString(buf, 0, cnt)); if(cnt==3 && buf[1]==0x02) { // Received GWInfo curAddr=new byte[] { buf[2] }; // addr break; } SendRaw(port, 0, searchGW); // Send SearchGW } Thread.Sleep(50); } if(curAddr==null) { port.Close(); continue; } lock(_gates) { var gw=new MsGSerial(port, curAddr[0]); _gates.Add(gw); } } catch(Exception ex) { if(_verbose.value) { Log.Debug("MQTTS.Serial search on {0} - {1}", pns[i], ex.Message); } try { if(port!=null) { if(port!=null && port.IsOpen) { port.Close(); } port.Dispose(); } } catch(Exception) { } } port=null; } _scanBusy=0; }
private static void SendRaw(MsGSerial g, MsMessage msg, byte[] tmp) { if(g==null || g._port==null || !g._port.IsOpen || msg==null) { return; } byte[] buf=msg.GetBytes(); int i, j=0; byte b; b=(byte)buf.Length; #if UART_RAW_MQTTSN tmp[j++]=b; for(i=0; i<buf.Length; i++) { tmp[j++]=buf[i]; } #else tmp[j++]=0xC0; if(b==0xC0 || b==0xDB) { tmp[j++]=0xDB; tmp[j++]=(byte)(b ^ 0x20); } else { tmp[j++]=b; } for(i=0; i<buf.Length; i++) { if(buf[i]==0xC0 || buf[i]==0xDB) { tmp[j++]=0xDB; tmp[j++]=(byte)(buf[i] ^ 0x20); } else { tmp[j++]=buf[i]; } } tmp[j++]=0xC0; #endif g._port.Write(tmp, 0, j); if(_verbose.value) { Log.Debug("s {0}: {1} {2}", g._port.PortName, BitConverter.ToString(buf), msg.ToString()); } }
private static void SendRaw(MsGSerial g, MsMessage msg) { if(g==null || g._port==null || !g._port.IsOpen || msg==null || msg.Addr==null || msg.Addr.Length!=1) { return; } int i; byte[] b=new byte[1]; b[0]=0xC0; g._port.Write(b, 0, 1); if(msg.Addr[0]==0xC0 || msg.Addr[0]==0xDB) { b[0]=0xDB; g._port.Write(b, 0, 1); b[0]=(byte)(msg.Addr[0] ^ 0x20); } else { b[0]=msg.Addr[0]; } g._port.Write(b, 0, 1); byte[] buf=msg.GetBytes(); for(i=0; i<buf.Length; i++) { if(buf[i]==0xC0 || buf[i]==0xDB) { b[0]=0xDB; g._port.Write(b, 0, 1); b[0]=(byte)(buf[i] ^ 0x20); } else { b[0]=buf[i]; } g._port.Write(b, 0, 1); } b[0]=0xC0; g._port.Write(b, 0, 1); if(_verbose.value) { Log.Debug("s {0:X2}:{1:X2}:{2} \t{3}", g.gwIdx, msg.Addr[0], BitConverter.ToString(buf), msg.ToString()); } }