gap: stop advertising

release
Yurii Soldak 3 years ago committed by Ron Evans
parent 8dc1e155a0
commit 20f0ce6119

@ -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())
}
}

@ -4,6 +4,7 @@
package bluetooth
import (
"errors"
"strings"
"github.com/godbus/dbus/v5"
@ -12,6 +13,8 @@ import (
"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.
type Address struct {
MACAddress
@ -22,6 +25,7 @@ type Advertisement struct {
adapter *Adapter
advertisement *api.Advertisement
properties *advertising.LEAdvertisement1Properties
cancel func()
}
// DefaultAdvertisement returns the default advertisement instance but does not
@ -60,10 +64,20 @@ func (a *Advertisement) Start() error {
if a.advertisement != nil {
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 {
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
}

@ -64,6 +64,13 @@ func (a *Advertisement) Start() error {
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
// is lost.
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)
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…
Cancel
Save