1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
//shows how to watch for new devices and list them
package discovery_example
import (
"context"
"os"
"os/signal"
"github.com/muka/go-bluetooth/api"
"github.com/muka/go-bluetooth/api/beacon"
"github.com/muka/go-bluetooth/bluez/profile/adapter"
"github.com/muka/go-bluetooth/bluez/profile/device"
log "github.com/sirupsen/logrus"
eddystone "github.com/suapapa/go_eddystone"
)
func Run(adapterID string, onlyBeacon bool) error {
//clean up connection on exit
defer api.Exit()
a, err := adapter.GetAdapter(adapterID)
if err != nil {
return err
}
log.Debug("Flush cached devices")
err = a.FlushDevices()
if err != nil {
return err
}
log.Debug("Start discovery")
discovery, cancel, err := api.Discover(a, nil)
if err != nil {
return err
}
defer cancel()
go func() {
for ev := range discovery {
if ev.Type == adapter.DeviceRemoved {
continue
}
dev, err := device.NewDevice1(ev.Path)
if err != nil {
log.Errorf("%s: %s", ev.Path, err)
continue
}
if dev == nil {
log.Errorf("%s: not found", ev.Path)
continue
}
log.Infof("name=%s addr=%s rssi=%d", dev.Properties.Name, dev.Properties.Address, dev.Properties.RSSI)
go func(ev *adapter.DeviceDiscovered) {
err = handleBeacon(dev)
if err != nil {
log.Errorf("%s: %s", ev.Path, err)
}
}(ev)
}
}()
ch := make(chan os.Signal)
signal.Notify(ch, os.Interrupt, os.Kill) // get notified of all OS signals
sig := <-ch
log.Infof("Received signal [%v]; shutting down...\n", sig)
return nil
}
func handleBeacon(dev *device.Device1) error {
b, err := beacon.NewBeacon(dev)
if err != nil {
return err
}
beaconUpdated, err := b.WatchDeviceChanges(context.Background())
if err != nil {
return err
}
isBeacon := <-beaconUpdated
if !isBeacon {
return nil
}
name := b.Device.Properties.Alias
if name == "" {
name = b.Device.Properties.Name
}
log.Debugf("Found beacon %s %s", b.Type, name)
if b.IsEddystone() {
ed := b.GetEddystone()
switch ed.Frame {
case eddystone.UID:
log.Debugf(
"Eddystone UID %s instance %s (%ddbi)",
ed.UID,
ed.InstanceUID,
ed.CalibratedTxPower,
)
break
case eddystone.TLM:
log.Debugf(
"Eddystone TLM temp:%.0f batt:%d last reboot:%d advertising pdu:%d (%ddbi)",
ed.TLMTemperature,
ed.TLMBatteryVoltage,
ed.TLMLastRebootedTime,
ed.TLMAdvertisingPDU,
ed.CalibratedTxPower,
)
break
case eddystone.URL:
log.Debugf(
"Eddystone URL %s (%ddbi)",
ed.URL,
ed.CalibratedTxPower,
)
break
}
}
if b.IsIBeacon() {
ibeacon := b.GetIBeacon()
log.Debugf(
"IBeacon %s (%ddbi) (major=%d minor=%d)",
ibeacon.ProximityUUID,
ibeacon.MeasuredPower,
ibeacon.Major,
ibeacon.Minor,
)
}
return nil
}
|