Skip to content

Commit 20f0ce6

Browse files
ysoldakdeadprogram
authored andcommitted
gap: stop advertising
1 parent 8dc1e15 commit 20f0ce6

File tree

4 files changed

+82
-1
lines changed

4 files changed

+82
-1
lines changed

examples/stop-advertisement/main.go

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// This example advertises for 5 minutes after
2+
// - boot
3+
// - disconnect
4+
// and then stops advertising.
5+
package main
6+
7+
import (
8+
"time"
9+
10+
"tinygo.org/x/bluetooth"
11+
)
12+
13+
var adapter = bluetooth.DefaultAdapter
14+
15+
var advUntil = time.Now().Add(5 * time.Minute)
16+
var advState = true
17+
18+
func main() {
19+
must("enable BLE stack", adapter.Enable())
20+
adv := adapter.DefaultAdvertisement()
21+
must("config adv", adv.Configure(bluetooth.AdvertisementOptions{
22+
LocalName: "Go Bluetooth",
23+
}))
24+
adapter.SetConnectHandler(func(device bluetooth.Addresser, connected bool) {
25+
if connected {
26+
println("connected, not advertising...")
27+
advState = false
28+
} else {
29+
println("disconnected, advertising...")
30+
advState = true
31+
advUntil = time.Now().Add(5 * time.Minute)
32+
}
33+
})
34+
must("start adv", adv.Start())
35+
36+
println("advertising...")
37+
address, _ := adapter.Address()
38+
for {
39+
if advState && time.Now().After(advUntil) {
40+
println("timeout, not advertising...")
41+
advState = false
42+
must("stop adv", adv.Stop())
43+
}
44+
println("Go Bluetooth /", address.MAC.String())
45+
time.Sleep(time.Second)
46+
}
47+
}
48+
49+
func must(action string, err error) {
50+
if err != nil {
51+
panic("failed to " + action + ": " + err.Error())
52+
}
53+
}

gap_linux.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package bluetooth
55

66
import (
7+
"errors"
78
"strings"
89

910
"github.com/godbus/dbus/v5"
@@ -12,6 +13,8 @@ import (
1213
"github.com/muka/go-bluetooth/bluez/profile/device"
1314
)
1415

16+
var errAdvertisementNotStarted = errors.New("bluetooth: stop advertisement that was not started")
17+
1518
// Address contains a Bluetooth MAC address.
1619
type Address struct {
1720
MACAddress
@@ -22,6 +25,7 @@ type Advertisement struct {
2225
adapter *Adapter
2326
advertisement *api.Advertisement
2427
properties *advertising.LEAdvertisement1Properties
28+
cancel func()
2529
}
2630

2731
// DefaultAdvertisement returns the default advertisement instance but does not
@@ -60,10 +64,20 @@ func (a *Advertisement) Start() error {
6064
if a.advertisement != nil {
6165
panic("todo: start advertisement a second time")
6266
}
63-
_, err := api.ExposeAdvertisement(a.adapter.id, a.properties, uint32(a.properties.Timeout))
67+
cancel, err := api.ExposeAdvertisement(a.adapter.id, a.properties, uint32(a.properties.Timeout))
6468
if err != nil {
6569
return err
6670
}
71+
a.cancel = cancel
72+
return nil
73+
}
74+
75+
// Stop advertisement. May only be called after it has been started.
76+
func (a *Advertisement) Stop() error {
77+
if a.cancel == nil {
78+
return errAdvertisementNotStarted
79+
}
80+
a.cancel()
6781
return nil
6882
}
6983

gap_nrf51.go

+7
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ func (a *Advertisement) Start() error {
6464
return makeError(errCode)
6565
}
6666

67+
// Stop advertisement.
68+
func (a *Advertisement) Stop() error {
69+
a.isAdvertising.Set(0)
70+
errCode := C.sd_ble_gap_adv_stop()
71+
return makeError(errCode)
72+
}
73+
6774
// Low-level version of Start. Used to restart advertisement when a connection
6875
// is lost.
6976
func (a *Advertisement) start() uint32 {

gap_nrf528xx-advertisement.go

+7
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,10 @@ func (a *Advertisement) Start() error {
8181
errCode := C.sd_ble_gap_adv_start(a.handle, C.BLE_CONN_CFG_TAG_DEFAULT)
8282
return makeError(errCode)
8383
}
84+
85+
// Stop advertisement.
86+
func (a *Advertisement) Stop() error {
87+
a.isAdvertising.Set(0)
88+
errCode := C.sd_ble_gap_adv_stop(a.handle)
89+
return makeError(errCode)
90+
}

0 commit comments

Comments
 (0)