| #!/usr/bin/env python3 |
| # |
| # Copyright (c) 2022 Project CHIP Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import argparse |
| import os |
| import sys |
| |
| try: |
| import qrcode |
| from SetupPayload import CommissioningFlow, SetupPayload |
| except ImportError: |
| SDK_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))) |
| sys.path.append(os.path.join(SDK_ROOT, "src/setup_payload/python")) |
| try: |
| import qrcode |
| from SetupPayload import CommissioningFlow, SetupPayload |
| except ModuleNotFoundError or ImportError: |
| no_onboarding_modules = True |
| else: |
| no_onboarding_modules = False |
| else: |
| no_onboarding_modules = False |
| |
| |
| def allow_any_int(i): return int(i, 0) |
| |
| |
| def get_args(): |
| parser = argparse.ArgumentParser(description="BouffaloLab QR Code generator tool") |
| mandatory_arguments = parser.add_argument_group( |
| "Mandatory keys", "These arguments must be provided to generate QR Code JSON file") |
| mandatory_arguments.add_argument("--vendor_id", type=allow_any_int, required=True, |
| help="[int | hex int] Provide Vendor Identification Number") |
| mandatory_arguments.add_argument("--product_id", type=allow_any_int, required=True, |
| help="[int | hex int] Provide Product Identification Number") |
| mandatory_arguments.add_argument("--discriminator", type=allow_any_int, required=True, |
| help="[int] Provide BLE pairing discriminator. \ |
| A 12-bit value matching the field of the same name in \ |
| the setup code. Discriminator is used during a discovery process.") |
| mandatory_arguments.add_argument("--pincode", type=allow_any_int, required=True, |
| help=("[int | hex] Default PASE session passcode. " |
| "(This is mandatory to generate QR Code).")) |
| mandatory_arguments.add_argument("-o", "--output", type=str, required=True, |
| help="Output path to store .json file, e.g. my_dir/output.json") |
| return parser.parse_args() |
| |
| |
| def generate_qrcode_data(args): |
| if no_onboarding_modules is False: |
| setup_payload = SetupPayload(discriminator=args.discriminator, |
| pincode=args.pincode, |
| rendezvous=2, # fixed pairing BLE |
| flow=CommissioningFlow.Standard, |
| vid=args.vendor_id, |
| pid=args.product_id) |
| with open(args.output[:-len(".json")] + ".txt", "w") as manual_code_file: |
| manual_code_file.write("Manualcode : " + setup_payload.generate_manualcode() + "\n") |
| manual_code_file.write("QRCode : " + setup_payload.generate_qrcode()) |
| qr = qrcode.make(setup_payload.generate_qrcode()) |
| qr.save(args.output[:-len(".json")] + ".png") |
| else: |
| print("Please install it with all dependencies: pip3 install -r ./scripts/setup/requirements.bouffalolab.txt from the Matter root directory") |
| |
| |
| def main(): |
| args = get_args() |
| generate_qrcode_data(args) |
| |
| |
| if __name__ == "__main__": |
| main() |