func genCharAttr(c *ble.Characteristic, h uint16) (uint16, []*attr) { vh := h + 1 a := &attr{ h: h, typ: ble.CharacteristicUUID, v: append([]byte{byte(c.Property), byte(vh), byte((vh) >> 8)}, c.UUID...), } va := &attr{ h: vh, typ: c.UUID, v: c.Value, rh: c.ReadHandler, wh: c.WriteHandler, } c.Handle = h c.ValueHandle = vh if c.NotifyHandler != nil || c.IndicateHandler != nil { c.CCCD = newCCCD(c) c.Descriptors = append(c.Descriptors, c.CCCD) } h += 2 attrs := []*attr{a, va} for _, d := range c.Descriptors { attrs = append(attrs, genDescAttr(d, h)) h++ } a.endh = h - 1 return h, attrs }