如何通过蓝牙从 python 将 MES 事件发送到 micro:bit

问题描述

我正在尝试使用 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 板的要求,这只是我的最佳猜测。如果您有更多信息,我可以更新答案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...