def GetCommissioner() -> Commissioner:
    """Gets a reference to the global commissioner singleton.

    Uses the configuration GetLocalNodeId().
    """

    global commissionerSingleton

    if commissionerSingleton is None:
        handle = GetLibraryHandle()
        _SetNativeCallSignatues(handle)

        native = handle.pychip_internal_Commissioner_New(GetLocalNodeId())
        if not native:
            raise Exception('Failed to create commissioner object.')

        handle.pychip_internal_PairingDelegate_SetNetworkCredentialsRequestedCallback(
            OnNetworkCredentialsRequested)
        handle.pychip_internal_PairingDelegate_SetOperationalCredentialsRequestedCallback(
            OnOperationalCredentialsRequested)
        handle.pychip_internal_PairingDelegate_SetPairingCompleteCallback(
            OnPairingComplete)

        commissionerSingleton = Commissioner(handle, native)

    return commissionerSingleton
Exemple #2
0
    def __init__(self):
        self.chipLib = GetLibraryHandle()
        self.__InitNativeFunctions(self.chipLib)
        self.attributes = {}
        self.vendor_attributes = {}

        def AddAttribute(name, value):
            self.attributes[name.decode()] = value.decode()
        def AddVendorAttribute(tag, value):
            self.vendor_attributes[tag] = value.decode()

        self.attribute_visitor = SetupPayload.AttributeVisitor(AddAttribute)
        self.vendor_attribute_visitor = SetupPayload.VendorAttributeVisitor(AddVendorAttribute)
class SetupPayload:
    # AttributeVisitor: void(const char* name, const char* value)
    AttributeVisitor = CFUNCTYPE(None, c_char_p, c_char_p)

    # VendorAttributeVisitor: void(uint8_t tag, const char* value)
    VendorAttributeVisitor = CFUNCTYPE(None, c_uint8, c_char_p)

    def __init__(self):
        self.chipLib = GetLibraryHandle()
        self.__InitNativeFunctions(self.chipLib)
        self.attributes = {}
        self.vendor_attributes = {}

        def AddAttribute(name, value):
            self.attributes[name.decode()] = value.decode()

        def AddVendorAttribute(tag, value):
            self.vendor_attributes[tag] = value.decode()

        self.attribute_visitor = SetupPayload.AttributeVisitor(AddAttribute)
        self.vendor_attribute_visitor = SetupPayload.VendorAttributeVisitor(
            AddVendorAttribute)

    def ParseQrCode(self, qrCode: str):
        self.Clear()
        err = self.chipLib.pychip_SetupPayload_ParseQrCode(
            qrCode.upper().encode(), self.attribute_visitor,
            self.vendor_attribute_visitor)

        if err != 0:
            raise ChipStackError(err)

        return self

    def ParseManualPairingCode(self, manualPairingCode: str):
        self.Clear()
        err = self.chipLib.pychip_SetupPayload_ParseManualPairingCode(
            manualPairingCode.encode(), self.attribute_visitor,
            self.vendor_attribute_visitor)

        if err != 0:
            raise ChipStackError(err)

        return self

    def PrintOnboardingCodes(self, passcode, vendorId, productId,
                             discriminator, customFlow, capabilities, version):
        self.Clear()
        err = self.chipLib.pychip_SetupPayload_PrintOnboardingCodes(
            passcode, vendorId, productId, discriminator, customFlow,
            capabilities, version)

        if err != 0:
            raise ChipStackError(err)

    def Print(self):
        for name, value in self.attributes.items():
            decorated_value = self.__DecorateValue(name, value)
            decorated_value = f" [{decorated_value}]" if decorated_value else ""
            print(f"{name}: {value}{decorated_value}")

        for tag in self.vendor_attributes:
            print(
                f"Vendor attribute '{tag:>3}': {self.vendor_attributes[tag]}")

    def Clear(self):
        self.attributes.clear()
        self.vendor_attributes.clear()

    def __DecorateValue(self, name, value):
        if name == "RendezvousInformation":
            rendezvous_methods = []
            if int(value) & 0b001:
                rendezvous_methods += ["SoftAP"]
            if int(value) & 0b010:
                rendezvous_methods += ["BLE"]
            if int(value) & 0b100:
                rendezvous_methods += ["OnNetwork"]
            return ', '.join(rendezvous_methods)

        return None

    def __InitNativeFunctions(self, chipLib):
        if chipLib.pychip_SetupPayload_ParseQrCode is not None:
            return
        setter = NativeLibraryHandleMethodArguments(chipLib)
        setter.Set("pychip_SetupPayload_ParseQrCode", c_int32, [
            c_char_p, SetupPayload.AttributeVisitor,
            SetupPayload.VendorAttributeVisitor
        ])
        setter.Set("pychip_SetupPayload_ParseManualPairingCode", c_int32, [
            c_char_p, SetupPayload.AttributeVisitor,
            SetupPayload.VendorAttributeVisitor
        ])
        setter.Set("pychip_SetupPayload_PrintOnboardingCodes", c_int32, [
            c_uint32, c_uint16, c_uint16, c_uint16, uint8_t, uint8_t, uint8_t
        ])