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} }
func cmdServe(c *cli.Context) error { testSvc := ble.NewService(lib.TestSvcUUID) testSvc.AddCharacteristic(lib.NewCountChar()) testSvc.AddCharacteristic(lib.NewEchoChar()) if err := ble.AddService(testSvc); err != nil { return errors.Wrap(err, "can't add service") } fmt.Printf("Serving GATT Server for %s...\n", c.Duration("tmo")) ctx := ble.WithSigHandler(context.WithTimeout(context.Background(), c.Duration("tmo"))) return chkErr(ble.AdvertiseNameAndServices(ctx, "Gopher", testSvc.UUID)) }
// NewBatteryService ... func NewBatteryService() *ble.Service { lv := byte(100) s := ble.NewService(ble.UUID16(0x180F)) c := s.NewCharacteristic(ble.UUID16(0x2A19)) c.HandleRead( ble.ReadHandlerFunc(func(req ble.Request, rsp ble.ResponseWriter) { rsp.Write([]byte{lv}) lv-- })) // Characteristic User Description c.NewDescriptor(ble.UUID16(0x2901)).SetValue([]byte("Battery level between 0 and 100 percent")) // Characteristic Presentation Format c.NewDescriptor(ble.UUID16(0x2904)).SetValue([]byte{4, 1, 39, 173, 1, 0, 0}) return s }
func main() { flag.Parse() d, err := dev.NewDevice(*device) if err != nil { log.Fatalf("can't new device : %s", err) } ble.SetDefaultDevice(d) testSvc := ble.NewService(lib.TestSvcUUID) testSvc.AddCharacteristic(lib.NewCountChar()) testSvc.AddCharacteristic(lib.NewEchoChar()) if err := ble.AddService(testSvc); err != nil { log.Fatalf("can't add service: %s", err) } // Advertise for specified durantion, or until interrupted by user. fmt.Printf("Advertising for %s...\n", *du) ctx := ble.WithSigHandler(context.WithTimeout(context.Background(), *du)) chkErr(ble.AdvertiseNameAndServices(ctx, "Gopher", testSvc.UUID)) }