mirror of
https://github.com/markqvist/Sideband.git
synced 2025-11-09 10:45:04 -05:00
95 lines
2.5 KiB
Go
95 lines
2.5 KiB
Go
// +build
|
|
|
|
// based on https://github.com/paypal/gatt/blob/master/examples/server.go
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
"github.com/paypal/gatt"
|
|
"github.com/paypal/gatt/linux/cmd"
|
|
)
|
|
|
|
|
|
var DefaultServerOptions = []gatt.Option{
|
|
gatt.LnxMaxConnections(1),
|
|
gatt.LnxDeviceID(-1, false),
|
|
gatt.LnxSetAdvertisingParameters(&cmd.LESetAdvertisingParameters{
|
|
AdvertisingIntervalMin: 0x04ff,
|
|
AdvertisingIntervalMax: 0x04ff,
|
|
AdvertisingChannelMap: 0x7,
|
|
}),
|
|
}
|
|
|
|
|
|
func NewTestPythonService() *gatt.Service {
|
|
n := 0
|
|
s := gatt.NewService(gatt.MustParseUUID("16fe0d00-c111-11e3-b8c8-0002a5d5c51b"))
|
|
|
|
s.AddCharacteristic(gatt.MustParseUUID("16fe0d01-c111-11e3-b8c8-0002a5d5c51b")).HandleReadFunc(
|
|
func(rsp gatt.ResponseWriter, req *gatt.ReadRequest) {
|
|
n = 0
|
|
log.Println("Echo")
|
|
fmt.Fprintf(rsp, "test")
|
|
})
|
|
s.AddCharacteristic(gatt.MustParseUUID("16fe0d02-c111-11e3-b8c8-0002a5d5c51b")).HandleWriteFunc(
|
|
func(r gatt.Request, data []byte) (status byte) {
|
|
n = 0
|
|
log.Println("Reset counter")
|
|
return gatt.StatusSuccess
|
|
})
|
|
s.AddCharacteristic(gatt.MustParseUUID("16fe0d03-c111-11e3-b8c8-0002a5d5c51b")).HandleWriteFunc(
|
|
func(r gatt.Request, data []byte) (status byte) {
|
|
n++
|
|
log.Println("Increment counter")
|
|
return gatt.StatusSuccess
|
|
})
|
|
s.AddCharacteristic(gatt.MustParseUUID("16fe0d04-c111-11e3-b8c8-0002a5d5c51b")).HandleReadFunc(
|
|
func(rsp gatt.ResponseWriter, req *gatt.ReadRequest) {
|
|
log.Println("Response counter: ", n)
|
|
fmt.Fprintf(rsp, "%d", n)
|
|
})
|
|
|
|
s.AddCharacteristic(gatt.MustParseUUID("16fe0d05-c111-11e3-b8c8-0002a5d5c51b")).HandleNotifyFunc(
|
|
func(r gatt.Request, n gatt.Notifier) {
|
|
log.Println("Notifications enabled")
|
|
cnt := 1
|
|
for !n.Done() {
|
|
fmt.Fprintf(n, "%d", cnt)
|
|
cnt++
|
|
time.Sleep(100 * time.Millisecond)
|
|
}
|
|
log.Println("Notifications disabled")
|
|
})
|
|
|
|
return s
|
|
}
|
|
|
|
|
|
func main() {
|
|
d, err := gatt.NewDevice(DefaultServerOptions...)
|
|
if err != nil {
|
|
log.Fatalf("Failed to open device, err: %s", err)
|
|
}
|
|
|
|
d.Handle(
|
|
gatt.CentralConnected(func(c gatt.Central) { fmt.Println("Connect: ", c.ID()) }),
|
|
gatt.CentralDisconnected(func(c gatt.Central) { fmt.Println("Disconnect: ", c.ID()) }),
|
|
)
|
|
|
|
onStateChanged := func(d gatt.Device, s gatt.State) {
|
|
fmt.Printf("State: %s\n", s)
|
|
switch s {
|
|
case gatt.StatePoweredOn:
|
|
s1 := NewTestPythonService()
|
|
d.AddService(s1)
|
|
d.AdvertiseNameAndServices("KivyBLETest", []gatt.UUID{s1.UUID()})
|
|
default:
|
|
}
|
|
}
|
|
|
|
d.Init(onStateChanged)
|
|
select {}
|
|
}
|