diff --git a/go.mod b/go.mod index d552df4d..e359d45b 100644 --- a/go.mod +++ b/go.mod @@ -37,5 +37,5 @@ require ( go.einride.tech/can v0.12.0 golang.org/x/net v0.28.0 golang.org/x/tools v0.24.0 // indirect - tinygo.org/x/bluetooth v0.10.0 + tinygo.org/x/bluetooth v0.12.0 ) diff --git a/go.sum b/go.sum index ab0f3206..7722e93c 100644 --- a/go.sum +++ b/go.sum @@ -120,10 +120,16 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/soypat/cyw43439 v0.0.0-20240609122733-da9153086796 h1:1/r2URInjjFtWqT61gU7YGVCq3BRyXt/C7z4oLRF9Lo= github.com/soypat/cyw43439 v0.0.0-20240609122733-da9153086796/go.mod h1:1Otjk6PRhfzfcVHeWMEeku/VntFqWghUwuSQyivb2vE= +github.com/soypat/cyw43439 v0.0.0-20250505012923-830110c8f4af h1:ZfFq94aH/BCSWWKd9RPUgdHOdgGKCnfl2VdvU9UksTA= +github.com/soypat/cyw43439 v0.0.0-20250505012923-830110c8f4af/go.mod h1:MUaGO5m6X7xrkHrPDmnaxCEcuCCFN/0ZFh9oie+exbU= github.com/soypat/natiu-mqtt v0.5.1/go.mod h1:xEta+cwop9izVCW7xOx2W+ct9PRMqr0gNVkvBPnQTc4= +github.com/soypat/natiu-mqtt v0.6.0/go.mod h1:xEta+cwop9izVCW7xOx2W+ct9PRMqr0gNVkvBPnQTc4= github.com/soypat/saleae v0.0.0-20230402180913-3584b7515dae/go.mod h1:9SV+w6E9YK/BePxdxYGXthkrRztHJCQlojWOjAxW3M4= +github.com/soypat/saleae v0.0.0-20230607000858-72cbd6ef4f23/go.mod h1:9SV+w6E9YK/BePxdxYGXthkrRztHJCQlojWOjAxW3M4= github.com/soypat/seqs v0.0.0-20240527012110-1201bab640ef h1:phH95I9wANjTYw6bSYLZDQfNvao+HqYDom8owbNa0P4= github.com/soypat/seqs v0.0.0-20240527012110-1201bab640ef/go.mod h1:oCVCNGCHMKoBj97Zp9znLbQ1nHxpkmOY9X+UAGzOxc8= +github.com/soypat/seqs v0.0.0-20250124201400-0d65bc7c1710 h1:Y9fBuiR/urFY/m76+SAZTxk2xAOS2n85f+H1CugajeA= +github.com/soypat/seqs v0.0.0-20250124201400-0d65bc7c1710/go.mod h1:oCVCNGCHMKoBj97Zp9znLbQ1nHxpkmOY9X+UAGzOxc8= github.com/stratoberry/go-gpsd v1.3.0 h1:JxJOEC4SgD0QY65AE7B1CtJtweP73nqJghZeLNU9J+c= github.com/stratoberry/go-gpsd v1.3.0/go.mod h1:nVf/vTgfYxOMxiQdy9BtJjojbFRtG8H3wNula++VgkU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -149,6 +155,8 @@ github.com/tinygo-org/cbgo v0.0.4 h1:3D76CRYbH03Rudi8sEgs/YO0x3JIMdyq8jlQtk/44fU github.com/tinygo-org/cbgo v0.0.4/go.mod h1:7+HgWIHd4nbAz0ESjGlJ1/v9LDU1Ox8MGzP9mah/fLk= github.com/tinygo-org/pio v0.0.0-20231216154340-cd888eb58899 h1:/DyaXDEWMqoVUVEJVJIlNk1bXTbFs8s3Q4GdPInSKTQ= github.com/tinygo-org/pio v0.0.0-20231216154340-cd888eb58899/go.mod h1:LU7Dw00NJ+N86QkeTGjMLNkYcEYMor6wTDpTCu0EaH8= +github.com/tinygo-org/pio v0.2.0 h1:vo3xa6xDZ2rVtxrks/KcTZHF3qq4lyWOntvEvl2pOhU= +github.com/tinygo-org/pio v0.2.0/go.mod h1:LU7Dw00NJ+N86QkeTGjMLNkYcEYMor6wTDpTCu0EaH8= github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -170,6 +178,8 @@ golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5D golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691 h1:/yRP+0AN7mf5DkD3BAI6TOFnd51gEoDEb8o35jIFtgw= golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20220617043117-41969df76e82/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -305,15 +315,20 @@ gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= tinygo.org/x/bluetooth v0.10.0 h1:42n8qj2tuF5AfdbAUR2Nv45EhtVmbDFH6UoWnt6lzZQ= tinygo.org/x/bluetooth v0.10.0/go.mod h1:t/Vm2a/rslsBoqFQKCBsWQw/cmRicQq+8Tl3tj5RCRI= +tinygo.org/x/bluetooth v0.12.0 h1:ztrLZfhcZsmzdpir7lBKNz+Q5Wbd6ZdUB98sYLhXWhw= +tinygo.org/x/bluetooth v0.12.0/go.mod h1:6+y5kVUN6tU7wtJj+qrcFJEVhas4/bIDhGNqvENmT74= tinygo.org/x/drivers v0.14.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= tinygo.org/x/drivers v0.15.1/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= tinygo.org/x/drivers v0.16.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= tinygo.org/x/drivers v0.19.0/go.mod h1:uJD/l1qWzxzLx+vcxaW0eY464N5RAgFi1zTVzASFdqI= tinygo.org/x/drivers v0.25.0/go.mod h1:v+mXaA4cgpz/YZJ3ZPm/86bYQJAXTaYtMkHlVwbodbw= tinygo.org/x/drivers v0.26.1-0.20230922160320-ed51435c2ef6/go.mod h1:X7utcg3yfFUFuKLOMTZD56eztXMjpkcf8OHldfTBsjw= +tinygo.org/x/drivers v0.28.1-0.20241028055853-0186d0905dcc/go.mod h1:q/mU8G/wz821p8xXqbkBACOlmZFDHXd//DnYnCW+dDQ= +tinygo.org/x/drivers v0.28.1-0.20241028090715-76a4276b5dea/go.mod h1:q/mU8G/wz821p8xXqbkBACOlmZFDHXd//DnYnCW+dDQ= tinygo.org/x/tinyfont v0.2.1/go.mod h1:eLqnYSrFRjt5STxWaMeOWJTzrKhXqpWw7nU3bPfKOAM= tinygo.org/x/tinyfont v0.3.0/go.mod h1:+TV5q0KpwSGRWnN+ITijsIhrWYJkoUCp9MYELjKpAXk= tinygo.org/x/tinyfont v0.4.0/go.mod h1:7nVj3j3geqBoPDzpFukAhF1C8AP9YocMsZy0HSAcGCA= tinygo.org/x/tinyfs v0.1.0/go.mod h1:ysc8Y92iHfhTXeyEM9+c7zviUQ4fN9UCFgSOFfMWv20= tinygo.org/x/tinyterm v0.1.0/go.mod h1:/DDhNnGwNF2/tNgHywvyZuCGnbH3ov49Z/6e8LPLRR4= tinygo.org/x/tinyterm v0.3.0/go.mod h1:F1pQjxEwNZQIc5czeJSBtk57ucEvbR4u7vHaLhWhHtg= +tinygo.org/x/tinyterm v0.3.1-0.20241028084705-e36d93d72cca/go.mod h1:cA/wQ+7eghtbs4ZB+xn9qhZoUIe4lRcsr6KID5iO78g= diff --git a/modules/ble/ble_enum.go b/modules/ble/ble_enum.go index 56560548..5cf7126d 100644 --- a/modules/ble/ble_enum.go +++ b/modules/ble/ble_enum.go @@ -27,21 +27,8 @@ func (mod *BLERecon) startEnumeration(address string) error { knownDev, found := mod.Session.BLE.Get(address) if !found || knownDev == nil { return fmt.Errorf("device with address %s not found", address) - } else if err := mod.adapter.StopScan(); err != nil { - mod.Warning("error stopping previous scan: %v", err) } - mod.current.ResetWrite() - - defer func() { - // make sure to restart scan when we're done - mod.Info("restoring ble scan") - if err := mod.adapter.Scan(mod.onDevice); err != nil { - mod.Error("error restoring ble scan: %v", err) - } - mod.Info("ble scan restored") - }() - mod.Info("connecting to %s ...", address) addr := bluetooth.Address{} @@ -54,11 +41,19 @@ func (mod *BLERecon) startEnumeration(address string) error { return err } + defer func() { + if err := device.Disconnect(); err != nil { + mod.Warning("error disconnecting from %s: %v", address, err) + } else { + mod.Info("disconnected from %s", address) + } + }() + mod.Session.Events.Add("ble.device.connected", knownDev) mod.Info("connected to %s", address) - srvcs, err := device.DiscoverServices(nil) + discoveredServices, err := device.DiscoverServices(nil) if err != nil { return fmt.Errorf("could not discover services for %s: %v", address, err) } @@ -68,7 +63,7 @@ func (mod *BLERecon) startEnumeration(address string) error { knownDev.ResetServices() - for _, svc := range srvcs { + for _, svc := range discoveredServices { service := network.NewBLEService(strings.ToLower(svc.UUID().String())) mod.Session.Events.Add("ble.device.service.discovered", svc) @@ -88,11 +83,11 @@ func (mod *BLERecon) startEnumeration(address string) error { rows = append(rows, row) - chars, err := svc.DiscoverCharacteristics(nil) + svcCharacteristics, err := svc.DiscoverCharacteristics(nil) if err != nil { mod.Error("error while enumerating chars for service %s: %s", svc.UUID(), err) } else { - for _, ch := range chars { + for _, ch := range svcCharacteristics { char := network.NewBLECharacteristic(strings.ToLower(ch.UUID().String())) if mtu, err := ch.GetMTU(); err != nil { mod.Warning("can't read %v mtu: %v", ch.UUID(), err) @@ -110,7 +105,6 @@ func (mod *BLERecon) startEnumeration(address string) error { } data := "" - multi := ([]string)(nil) raw := make([]byte, 255) if n, err := ch.Read(raw); err == nil { raw = raw[0:n] @@ -118,27 +112,12 @@ func (mod *BLERecon) startEnumeration(address string) error { data = parseRawData(raw) } - if multi == nil { - char.Data = data - rows = append(rows, []string{ - name, - strings.Join(char.Properties, ", "), - data, - }) - } else { - char.Data = multi - for i, m := range multi { - if i == 0 { - rows = append(rows, []string{ - name, - strings.Join(char.Properties, ", "), - m, - }) - } else { - rows = append(rows, []string{"", "", "", m}) - } - } - } + char.Data = data + rows = append(rows, []string{ + name, + strings.Join(char.Properties, ", "), + data, + }) service.Characteristics = append(service.Characteristics, char) } @@ -151,11 +130,5 @@ func (mod *BLERecon) startEnumeration(address string) error { tui.Table(mod.Session.Events.Stdout, columns, rows) - if err := device.Disconnect(); err != nil { - mod.Warning("error disconnecting from %s: %v", address, err) - } else { - mod.Info("disconnected from %s", address) - } - return nil } diff --git a/modules/ble/ble_recon.go b/modules/ble/ble_recon.go index e6cd9fcd..410184f0 100644 --- a/modules/ble/ble_recon.go +++ b/modules/ble/ble_recon.go @@ -62,7 +62,7 @@ func NewBLERecon(s *session.Session) *BLERecon { // deviceId: -1, quit: make(chan bool), done: make(chan bool), - connTimeout: 5, + connTimeout: 15, devTTL: 30, current: &CurrentDevice{}, }