示例#1
0
      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;
      }
示例#2
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;
      }
示例#3
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());
        }
      }
示例#4
0
 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());
   }
 }