gap: stop advertising
This commit is contained in:
parent
8dc1e155a0
commit
20f0ce6119
4 changed files with 82 additions and 1 deletions
53
examples/stop-advertisement/main.go
Normal file
53
examples/stop-advertisement/main.go
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
// This example advertises for 5 minutes after
|
||||||
|
// - boot
|
||||||
|
// - disconnect
|
||||||
|
// and then stops advertising.
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/bluetooth"
|
||||||
|
)
|
||||||
|
|
||||||
|
var adapter = bluetooth.DefaultAdapter
|
||||||
|
|
||||||
|
var advUntil = time.Now().Add(5 * time.Minute)
|
||||||
|
var advState = true
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
must("enable BLE stack", adapter.Enable())
|
||||||
|
adv := adapter.DefaultAdvertisement()
|
||||||
|
must("config adv", adv.Configure(bluetooth.AdvertisementOptions{
|
||||||
|
LocalName: "Go Bluetooth",
|
||||||
|
}))
|
||||||
|
adapter.SetConnectHandler(func(device bluetooth.Addresser, connected bool) {
|
||||||
|
if connected {
|
||||||
|
println("connected, not advertising...")
|
||||||
|
advState = false
|
||||||
|
} else {
|
||||||
|
println("disconnected, advertising...")
|
||||||
|
advState = true
|
||||||
|
advUntil = time.Now().Add(5 * time.Minute)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
must("start adv", adv.Start())
|
||||||
|
|
||||||
|
println("advertising...")
|
||||||
|
address, _ := adapter.Address()
|
||||||
|
for {
|
||||||
|
if advState && time.Now().After(advUntil) {
|
||||||
|
println("timeout, not advertising...")
|
||||||
|
advState = false
|
||||||
|
must("stop adv", adv.Stop())
|
||||||
|
}
|
||||||
|
println("Go Bluetooth /", address.MAC.String())
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func must(action string, err error) {
|
||||||
|
if err != nil {
|
||||||
|
panic("failed to " + action + ": " + err.Error())
|
||||||
|
}
|
||||||
|
}
|
16
gap_linux.go
16
gap_linux.go
|
@ -4,6 +4,7 @@
|
||||||
package bluetooth
|
package bluetooth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/godbus/dbus/v5"
|
"github.com/godbus/dbus/v5"
|
||||||
|
@ -12,6 +13,8 @@ import (
|
||||||
"github.com/muka/go-bluetooth/bluez/profile/device"
|
"github.com/muka/go-bluetooth/bluez/profile/device"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var errAdvertisementNotStarted = errors.New("bluetooth: stop advertisement that was not started")
|
||||||
|
|
||||||
// Address contains a Bluetooth MAC address.
|
// Address contains a Bluetooth MAC address.
|
||||||
type Address struct {
|
type Address struct {
|
||||||
MACAddress
|
MACAddress
|
||||||
|
@ -22,6 +25,7 @@ type Advertisement struct {
|
||||||
adapter *Adapter
|
adapter *Adapter
|
||||||
advertisement *api.Advertisement
|
advertisement *api.Advertisement
|
||||||
properties *advertising.LEAdvertisement1Properties
|
properties *advertising.LEAdvertisement1Properties
|
||||||
|
cancel func()
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultAdvertisement returns the default advertisement instance but does not
|
// DefaultAdvertisement returns the default advertisement instance but does not
|
||||||
|
@ -60,10 +64,20 @@ func (a *Advertisement) Start() error {
|
||||||
if a.advertisement != nil {
|
if a.advertisement != nil {
|
||||||
panic("todo: start advertisement a second time")
|
panic("todo: start advertisement a second time")
|
||||||
}
|
}
|
||||||
_, err := api.ExposeAdvertisement(a.adapter.id, a.properties, uint32(a.properties.Timeout))
|
cancel, err := api.ExposeAdvertisement(a.adapter.id, a.properties, uint32(a.properties.Timeout))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
a.cancel = cancel
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop advertisement. May only be called after it has been started.
|
||||||
|
func (a *Advertisement) Stop() error {
|
||||||
|
if a.cancel == nil {
|
||||||
|
return errAdvertisementNotStarted
|
||||||
|
}
|
||||||
|
a.cancel()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,13 @@ func (a *Advertisement) Start() error {
|
||||||
return makeError(errCode)
|
return makeError(errCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stop advertisement.
|
||||||
|
func (a *Advertisement) Stop() error {
|
||||||
|
a.isAdvertising.Set(0)
|
||||||
|
errCode := C.sd_ble_gap_adv_stop()
|
||||||
|
return makeError(errCode)
|
||||||
|
}
|
||||||
|
|
||||||
// Low-level version of Start. Used to restart advertisement when a connection
|
// Low-level version of Start. Used to restart advertisement when a connection
|
||||||
// is lost.
|
// is lost.
|
||||||
func (a *Advertisement) start() uint32 {
|
func (a *Advertisement) start() uint32 {
|
||||||
|
|
|
@ -81,3 +81,10 @@ func (a *Advertisement) Start() error {
|
||||||
errCode := C.sd_ble_gap_adv_start(a.handle, C.BLE_CONN_CFG_TAG_DEFAULT)
|
errCode := C.sd_ble_gap_adv_start(a.handle, C.BLE_CONN_CFG_TAG_DEFAULT)
|
||||||
return makeError(errCode)
|
return makeError(errCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stop advertisement.
|
||||||
|
func (a *Advertisement) Stop() error {
|
||||||
|
a.isAdvertising.Set(0)
|
||||||
|
errCode := C.sd_ble_gap_adv_stop(a.handle)
|
||||||
|
return makeError(errCode)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue