func (d *device) respondToRequest(id int, args xpc.Dict) { switch id { case 19: // ReadRequest u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")} t := args.MustGetInt("kCBMsgArgTransactionID") a := args.MustGetInt("kCBMsgArgAttributeID") o := args.MustGetInt("kCBMsgArgOffset") attr := d.attrs[a] v := attr.value if v == nil { c := newCentral(d, u) req := &ReadRequest{ Request: Request{Central: c}, Cap: int(c.mtu - 1), Offset: o, } rsp := newResponseWriter(int(c.mtu - 1)) if c, ok := attr.pvt.(*Characteristic); ok { c.rhandler.ServeRead(rsp, req) v = rsp.bytes() } } d.sendCmd(13, xpc.Dict{ "kCBMsgArgAttributeID": a, "kCBMsgArgData": v, "kCBMsgArgTransactionID": t, "kCBMsgArgResult": 0, }) case 20: // WriteRequest u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")} t := args.MustGetInt("kCBMsgArgTransactionID") a := 0 noRsp := false xxws := args.MustGetArray("kCBMsgArgATTWrites") for _, xxw := range xxws { xw := xxw.(xpc.Dict) if a == 0 { a = xw.MustGetInt("kCBMsgArgAttributeID") } o := xw.MustGetInt("kCBMsgArgOffset") i := xw.MustGetInt("kCBMsgArgIgnoreResponse") b := xw.MustGetBytes("kCBMsgArgData") _ = o attr := d.attrs[a] c := newCentral(d, u) r := Request{Central: c} attr.pvt.(*Characteristic).whandler.ServeWrite(r, b) if i == 1 { noRsp = true } } if noRsp { break } d.sendCmd(13, xpc.Dict{ "kCBMsgArgAttributeID": a, "kCBMsgArgData": nil, "kCBMsgArgTransactionID": t, "kCBMsgArgResult": 0, }) case 21: // subscribed u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")} a := args.MustGetInt("kCBMsgArgAttributeID") attr := d.attrs[a] c := newCentral(d, u) d.subscribers[u.String()] = c c.startNotify(attr, c.mtu) case 22: // unubscribed u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")} a := args.MustGetInt("kCBMsgArgAttributeID") attr := d.attrs[a] if c := d.subscribers[u.String()]; c != nil { c.stopNotify(attr) } case 23: // notificationSent } }