package drviers import ( "bytes" "errors" bus "github.com/ammeter/Bus" "github.com/yuguorong/go/log" ) type SAirModel struct { Id string `json:"id"` DevName string `json:"devName"` Code string `json:"code"` Protocol string `json:"protocol"` GwDevId string `json:"gwDevId"` } type Uemis struct { baseDevice devList map[string]SAirModel //name->Id chnExit chan bool loopserver bool } func (u *Uemis) ChannelDispatch(stream []byte, args interface{}) bus.ChnDispResult { devName := "" buf := bytes.NewBuffer(stream) mret := u.Route[1].iproto.ParsePacket(buf.Bytes(), &devName) if mret != nil && devName != "" { devN := devName[8:] devN = "SA10" + "-00000000" + devN if _, has := u.devList[devN]; has { log.Info(u.DeviceName+" Dispatch ["+devN+"]: ", string(stream)) return bus.DispatchMulti } } return bus.DispatchNone } func (u *Uemis) Run() error { u.loopserver = true for u.loopserver { select { case msg := <-u.Route[1].router[0]: b := msg.([]byte) devName := "" mret := u.Route[1].iproto.ParsePacket(b, &devName) if mret != nil && devName != "" { v := mret.(map[string]interface{}) dev := devName[8:] dev = "SA10" + "-00000000" + dev log.Info(u.baseDevice.Id+"/"+dev, v) telemetry := u.Route[0].iproto.PackageCmd(dev, mret) u.Route[0].ibus.Send(u.Route[0].iChn, telemetry) } case <-u.chnExit: u.loopserver = false } } return nil } func (u *Uemis) Open(...interface{}) error { lenr := len(u.Route) if lenr < 1 { return errors.New("wrong route config") } else if lenr < 2 { u.SetRoute(u, "HJ212", "dtuFtpServer", "HJ212-"+u.Id, 0) } if !u.loopserver { go u.Run() } return nil } func (u *Uemis) Close() error { u.loopserver = false u.chnExit <- true return nil } func (u *Uemis) GetDevice(s string) interface{} { return u } type UemisDrv struct { baseDriver } func (drv *UemisDrv) GetModel() interface{} { return &[]SAirModel{} } func (drv *UemisDrv) CreateDevice(model interface{}, filterGwId string) (int, []IDevice) { drv.baseDriver.CreateDevice(model, filterGwId) devlist := make([]IDevice, 0) mlist := model.(*[]SAirModel) var dev *Uemis = nil for _, m := range *mlist { if m.GwDevId == filterGwId { if dev == nil { dev = new(Uemis) dev.loopserver = false dev.devList = make(map[string]SAirModel) dev.Id = m.Id dev.DeviceName = "S5-" + dev.Id dev.Probe(dev.DeviceName, drv) drv.baseDriver.DevList[dev.DeviceName] = dev devlist = append(devlist, dev) } //m.DevName = strings.ReplaceAll(m.DevName, "SAIR10", "S10") dev.devList[m.DevName] = m } } return len(devlist), devlist } func NewUemis(param interface{}) IDriver { drv := new(UemisDrv) return drv } func init() { driverReg["SA10"] = NewUemis }