code: func (ble *BLE) DiscoverCharacteristics(deviceUuid xpc.UUID, serviceUuid string, characteristicUuids []string) {
  	sUuid := deviceUuid.String()
  	msg := 61
  	if ble.utsname.Release >= "18." {
  		msg = 87
  	}
  	if p, ok := ble.peripherals[sUuid]; ok {
  		cUuids := make([]string, len(characteristicUuids))
  		for i, cuuid := range characteristicUuids {
  			cUuids[i] = cuuid // characteristicUuids may be a list of []byte (2 bytes)
  		}
  
  		ble.sendCBMsg(msg, xpc.Dict{
  			"kCBMsgArgDeviceUUID":         p.Uuid,
  			"kCBMsgArgServiceStartHandle": p.Services[serviceUuid].startHandle,
  			"kCBMsgArgServiceEndHandle":   p.Services[serviceUuid].endHandle,
  			"kCBMsgArgUUIDs":              cUuids,
  		})
  
  	} else {
  		log.Println("no peripheral", deviceUuid)
  	}
  }
docs: // discover characteristics