// NewEchoChar ... func NewEchoChar() *ble.Characteristic { e := &echoChar{m: make(map[string]chan []byte)} c := ble.NewCharacteristic(EchoCharUUID) c.HandleWrite(ble.WriteHandlerFunc(e.written)) c.HandleNotify(ble.NotifyHandlerFunc(e.echo)) c.HandleIndicate(ble.NotifyHandlerFunc(e.echo)) return c }
// NewCountChar ... func NewCountChar() *ble.Characteristic { n := 0 c := ble.NewCharacteristic(CountCharUUID) c.HandleRead(ble.ReadHandlerFunc(func(req ble.Request, rsp ble.ResponseWriter) { fmt.Fprintf(rsp, "count: Read %d", n) log.Printf("count: Read %d", n) n++ })) c.HandleWrite(ble.WriteHandlerFunc(func(req ble.Request, rsp ble.ResponseWriter) { log.Printf("count: Wrote %s", string(req.Data())) })) c.HandleNotify(ble.NotifyHandlerFunc(func(req ble.Request, n ble.Notifier) { cnt := 0 log.Printf("count: Notification subscribed") for { select { case <-n.Context().Done(): log.Printf("count: Notification unsubscribed") return case <-time.After(time.Second): log.Printf("count: Notify: %d", cnt) if _, err := fmt.Fprintf(n, "Count: %d", cnt); err != nil { // Client disconnected prematurely before unsubscription. log.Printf("count: Failed to notify : %s", err) return } cnt++ } } })) c.HandleIndicate(ble.NotifyHandlerFunc(func(req ble.Request, n ble.Notifier) { cnt := 0 log.Printf("count: Indication subscribed") for { select { case <-n.Context().Done(): log.Printf("count: Indication unsubscribed") return case <-time.After(time.Second): log.Printf("count: Indicate: %d", cnt) if _, err := fmt.Fprintf(n, "Count: %d", cnt); err != nil { // Client disconnected prematurely before unsubscription. log.Printf("count: Failed to indicate : %s", err) return } cnt++ } } })) return c }
func defaultServices(name string) []*ble.Service { // https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.ble.appearance.xml var gapCharAppearanceGenericComputer = []byte{0x00, 0x80} gapSvc := ble.NewService(ble.GAPUUID) gapSvc.NewCharacteristic(ble.DeviceNameUUID).SetValue([]byte(name)) gapSvc.NewCharacteristic(ble.AppearanceUUID).SetValue(gapCharAppearanceGenericComputer) gapSvc.NewCharacteristic(ble.PeripheralPrivacyUUID).SetValue([]byte{0x00}) gapSvc.NewCharacteristic(ble.ReconnectionAddrUUID).SetValue([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) gapSvc.NewCharacteristic(ble.PeferredParamsUUID).SetValue([]byte{0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0xd0, 0x07}) gattSvc := ble.NewService(ble.GATTUUID) gattSvc.NewCharacteristic(ble.ServiceChangedUUID).HandleIndicate( ble.NotifyHandlerFunc(func(r ble.Request, n ble.Notifier) { log.Printf("TODO: indicate client when the services are changed") for { select { case <-n.Context().Done(): log.Printf("count: Notification unsubscribed") return } } })) return []*ble.Service{gapSvc, gattSvc} }