micropython文件上传软件_MicroPython BLE Library

MicroPython BLE Library

Licence-MIT-green.svg?style=for-the-badge

项目介绍

根据之前研究学习到的 Micropython BLE 相关知识,将相关代码模块封装成为类库,方便以后使用

BLE 相关名词解释

为了后文便于理解,也避免出现关贸总协定这样怪异的翻译,特此对几个名词做出我个人的理解,如有误导欢迎斧正

Profile

可以理解为 BLE 设备作为某个指定用途的说明文档,或者概述、简介等,比如作为HID设备(通常为键盘鼠标摇杆等外设)时,必须要实现以下三个服务:

Battery Service

Device Information

Human Interface Device

对这 3 个必要服务的说明就是Profile的作用

Services

项目中提供的 Services 以及后面的 Characteristics 和 Descriptors 都是由 Bluetooth® Technology Website 定义的一些统一规范,所有人按照规范进行蓝牙硬件设备开发,在不需要额外开发软件的前提下我们的硬件设备即可以被诸如 PC、手机等中心设备(Central)识别并使用

服务的作用是告知中心设备我们的硬件将会提供什么样的服务,比如上述HID的 Profile 包含了 3 个服务,中心设备就会把它识别为一个键盘鼠标类的外围设备(Peripheral)

Characteristics

名为特征,可以理解为服务的属性参数,就像一个 Profile 可以包含多个服务一样,服务也可以包含多个特征,用于具体描述某个服务的某项特征值

比如Battery Service服务包含了Battery Level特征,向它写入一个 0 到 100 的数值,就可以告知中心设备当前我们的设备电量情况

Descriptors

和服务一样,每个特征还可以包含多个描述符,描述符的作用是对特征的额外设置,比如一些中心设备会向我们的外围设备中的某个特征发送通知(Notify),描述符可以设置是否接收通知,等

如何使用?

下面以main.py为例讲解如何使用类库生成一个 Profile

假设你已经掌握了MicroPython ubluetooth模块的基本使用方法

导入类库文件

import ubluetooth as bt

from ble.const import BLEConst

from ble.tools import BLETools

from ble.profile.manager import ProfileManager

from ble.services import *

from ble.characteristics import *

from ble.descriptors import *

生成 Profile

profile = ProfileManager()

profile.add_services(

BatteryService().add_characteristics(

Characteristics(BLEConst.Characteristics.BATTERY_LEVEL, BLEConst.CharacteristicFlags.BATTERY_LEVEL_)

),

HumanInterfaceDevice().add_characteristics(

Characteristics(BLEConst.Characteristics.REPORT, BLEConst.CharacteristicFlags.REPORT_).add_descriptors(

ClientCharacteristicConfiguration(),

)

),

)

这里给 Profile 添加了 2 个服务,每个服务添加了 1 个特征和一个额外的描述符

Battery Service(服务)

Battery Level(特征)

Human Interface Device(服务)

Report(特征)

Client Characteristic Configuration(描述符)

本来计划中应该使用更一目了然更直观的方式生成 Profile 的,例如这样

# 定义 HID 设备必须的 3 个服务

profile.add_services(

HumanInterfaceDevice().add_characteristics(

ReportMap(),

Report(),

ProtocolMode(),

HIDInformation(),

HIDControlPoint(),

BootMouseInputReport(),

),

DeviceInformation().add_characteristics(

PNPID(),

),

BatteryService().add_characteristics(

BatteryLevel(),

),

)

但是鉴于官方定义的特征实在太多了,一一简化倒是会方便开发,但是相应的类库文件就会非常巨大(相对于 ESP32 的 4M 存储来说),无奈只能选择使用比较麻烦的方法了,但是服务和描述符相对较少,所以依然使用了简化方式

注册服务

注册服务,获取特征和描述符句柄,用于和中心设备交互

定义句柄的顺序必须和定义 Profile 时候的顺序一致

ble = bt.BLE()

services = profile.get_services()

(

(

handle_battery_level,

),

(

handle_report,

handle_report_desc,

),

) = ble.gatts_register_services(services)

生成广播信息

为避免广播内容太多导致广播失败,建议将设备名称放置到Scan Response中

uuids = profile.get_services_uuid()

appearance = BLEConst.Appearance.GENERIC_HEART_RATE_SENSOR

adv_payload = BLETools.advertising_generic_payload(

services=uuids,

appearance=appearance

)

resp_payload = BLETools.advertising_resp_payload(

name="BLELibTest"

)

广播信息

广播 Profile 包含的 Services 信息,中心设备收到信息后经过分析可以展示给用户

ble.gap_advertise(None)

ble.gap_advertise(interval_us=100000, adv_data=adv_payload, resp_data=resp_payload)

向中心设备传递消息通知

先在设备本地写入一个电量值,然后使用Notify方法告知中心设备

import struct

ble.gatts_write(handle_battery_level, struct.pack("

ble.gatts_notify(conn_handle, handle_battery_level)

handle_battery_level是注册服务时获取的句柄

conn_handle是中心设备连接时的连接句柄

基本使用方法就是如此了,下面看一下中心设备展示给用户的内容吧

查看一下效果吧

因为示例中使用的 Profile 为随机搭配的内容,所以并不能在电脑、手机上直接搜索到,我们需要借助第三方 APP 进行查看,比如 nRF Connect

screenshot_01.png

screenshot_02.png

REPL中完整的输出内容如下

activating ble...

I (57150) BTDM_INIT: BT controller compile version [5aed448]

I (60951) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE

I (61051) phy: phy_version: 4102, 2fa7a43, Jul 15 2019, 13:06:06, 0, 0

GAP procedure initiated: stop advertising.

ble activated

services registed

GAP procedure initiated: advertise; disc_mode=2 adv_channel_map=7 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=160 adv_itvl_max=160

advertising...

>>> [52:5F:AF:24:C3:38] connected, handle: 0

[52:5F:AF:24:C3:38] disconnected, handle: 0

GAP procedure initiated: advertise; disc_mode=2 adv_channel_map=7 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=160 adv_itvl_max=160

advertising...

下载烧录自定义固件

最简便的使用本类库的方式就是下载并烧录我的自定义固件,免去上传冗长文件的过程

访问 自定义固件下载项目 下载最新的自定义固件,并参考 附录1:如何刷写固件 烧录固件到开发板

合作交流

QQ 交流群:

走线物联:163271910

扇贝物联:31324057

qrcode_walkline.png

qrcode_bigiot.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值