作れるものはなんでも作ります
他メーカーのICだとZigbeeの各機能をCLIとして提供しており、それをさらにPythonやNode.js等の言語でラップすることでMQTTやHomeKitのブリッジを実現しています。NordicにもそのようなCLI環境が用意されているので、動かせる状態まで持っていく手順を記載します。
nRF52840モジュールは、スイッチサイエンスで販売しているMS88SF2を使いました。nRF52840はUSBのPHYを内蔵しています。そんなに高速ではないので、ブレッドボードで雑につないでもとりあえず動きます。
書き込むファームウェアはNordic評価基板を前提としているので、UART等のピン配列もそれに沿った設定になっています。生のUARTは使えないことが多いですが、USBデバイスもあらかじめ有効になっているのでこちらを活用します。ホスト側ではシリアル通信として認識されるので、WindowsならばCOMn、macOS/Linuxならば/dev/tty*として利用できます。
Pythonライブラリに同梱のhexファイルは、nrfjprogでのみ書き込みが成功しました。J-LINKのJ-FlashやnRF Connect for Desktopでは、hexファイルに問題があるというエラーが出て失敗します。
正しく設定できていると、下記のログが表示されます。通信ができているのかはまだ確認できていません。
% python MQTT_Zigbee_gateway.py
MQTT_Zigbee_gateway.py: INFO: Connected to broker. Starting CLI...
zb_cli_dev.py: INFO: Trying to open com port /dev/tty.usbmodemDDBD480AEB721. Attempts left: 10.
zb_cli_dev.py: INFO: Com port /dev/tty.usbmodemDDBD480AEB721 opened successfully.
MQTT_Zigbee_gateway.py: INFO: CLI device created, trying to connect ...
zb_cli_dev.py: INFO: Trying to connect cli to network. Attempts left: 9
zb_cli_dev.py: INFO: Trying to connect cli to network. Attempts left: 8
zb_cli_dev.py: INFO: CLI short address: 0x0000
MQTT_Zigbee_gateway.py: INFO: Client started.
わかりにくいドキュメントしか参照できるものがなく、実行してみた記録もほとんどインターネットに載っていないので、動かすまで苦労しました。Python側ではCLIをよしなに扱うためにThreadを立てており、それらの挙動はまだ理解していません。レイヤーの高低を幅広く読むのは苦労しますね。