问题描述
我正在尝试使用 Python 代码将事件从我的 RaspBerry Pi Zero W 发送到我的 micro:bit 以控制 Kitronik Servo:Lite 板。
我已经证明 micro:bit 可以使用 Kitronik 示例代码和 Kitronik android 游戏手柄应用程序控制 Servo:Lite 板。在我的 python 代码中,我可以像这样成功地将 Pi 连接到 micro:bit:
from bluezero import microbit
ubit = microbit.Microbit(adapter_addr='xx:xx:xx:xx:xx:xx',device_addr='yy:yy:yy:yy:yy:yy')
my_text = 'Hello,world'
ubit.connect()
Kitronik 发布的 android 应用发送 MES events 来控制 Servo:Lite 板。如何从我的 python 代码发送这些?
解决方法
Bluezero 库不支持 microbit
模块中的消息事件服务 (MES)。
Bluezero 的目标是易于使用,作为 BLE 的介绍。我不需要使用 MES 服务,因此没有花时间使用 micro:bit Bluetooth Profile 中的信息构建适合初学者的 API。
我的理解是,在您的应用程序中,连接时 Python 代码应读取 MicroBit Requirements
特征(UUID:E95DB84C-251D-470A-A062-FA1922DFA9A8
)
然后通过 Client Event
特性(UUID:E95D5404-251D-470A-A062-FA1922DFA9A8
)发送命令
正如您将在 micro:bit Bluetooth Profile 文档中看到的,事件是数字。其中一些数字可以从以下网址获得:https://lancaster-university.github.io/microbit-docs/ble/event-service/#microbit-code-for-the-buggy-controller。
为了让您用尽可能少的代码行获得一些东西,这里有一个使用 BLE-GATT 库的示例。
from time import sleep
import BLE_GATT
ubit_address = 'yy:yy:yy:yy:yy:yy'
ubit_req = 'E95DB84C-251D-470A-A062-FA1922DFA9A8'
client_event = 'E95D5404-251D-470A-A062-FA1922DFA9A8'
MES_DPAD_CONTROLLER = 1104
MES_DPAD_1_BUTTON_UP_ON = 1
MES_DPAD_1_BUTTON_UP_OFF = 2
MES_DPAD_1_BUTTON_DOWN_ON = 3
MES_DPAD_1_BUTTON_DOWN_OFF = 4
MES_DPAD_1_BUTTON_LEFT_ON = 5
MES_DPAD_1_BUTTON_LEFT_OFF = 6
MES_DPAD_1_BUTTON_RIGHT_ON = 7
MES_DPAD_1_BUTTON_RIGHT_OFF = 8
MES_DPAD_2_BUTTON_UP_ON = 9
MES_DPAD_2_BUTTON_UP_OFF = 10
MES_DPAD_2_BUTTON_DOWN_ON = 11
MES_DPAD_2_BUTTON_DOWN_OFF = 12
MES_DPAD_2_BUTTON_LEFT_ON = 13
MES_DPAD_2_BUTTON_LEFT_OFF = 14
MES_DPAD_2_BUTTON_RIGHT_ON = 15
MES_DPAD_2_BUTTON_RIGHT_OFF = 16
ubit = BLE_GATT.Central(ubit_address)
ubit.connect()
# Print what micro:bit is interested in
print(ubit.char_read(ubit_req))
# Send left D-Pad pressed
ubit.char_write(client_event,MES_DPAD_CONTROLLER.to_bytes(2,byteorder='little') + MES_DPAD_1_BUTTON_UP_ON.to_bytes(2,byteorder='little'))
# Wait 3 seconds
sleep(3)
# Release the button
ubit.char_write(client_event,byteorder='little') + MES_DPAD_1_BUTTON_UP_OFF.to_bytes(2,byteorder='little'))
ubit.disconnect()
我无法测试这是否是 Kitronik Servo:Lite 板的要求,这只是我的最佳猜测。如果您有更多信息,我可以更新答案。