[原创] 深入浅出解读BBC Micro:bit - Runtime(2)
1103 查看
6 回复
 楼主 | 发布于 2019-07-02 | 只看楼主
分享到:

上回说到runtime为了给使用者提供方便,生成了一个Microbit常用组件的集合,uBit就是这个对象的实例。uBit包含的组件列表中有关于Microbit板子上绝大多数可拆分的组件,包含按钮、接口、存储器、消息集合、显示、加速度传感器、磁力传感器、温度传感器、标准io、私有协议的射频等等。可是nRF51822的蓝牙部分并为被包含在uBit中。这一方面是由于蓝牙相关的组件特别是安全机制比较复杂,对初学者往往会有难度,另一方面蓝牙的应用大多是基于GATT层的profile描述来展开的,不同的应用对应的服务最后都会包装在GATT层,所以uBit组件中只是将通用处理器可以离开蓝牙单独运行的组件做了封装,并和消息触发机制结合,从而打造runtime为高级语言的调用做基础。 


那么,microbit runtime的蓝牙profile究竟是怎样封装的呢?我们今天就来看看究竟 

这里顺便插一句,我们平常在说蓝牙SOC或者蓝牙芯片时通常默认为这颗芯片离了蓝牙就不能工作——事实恰恰相反,uBit中的组件都是可以离开蓝牙工作的,在蓝牙连接之外,SOC其实和普通MCU没有什么差异,开发者正式基于这颗IC的众多IO和标准接口打造了与高级软件对接的能力,这也是BBC Microbit能够为初学者带来的在稳定蓝牙连接之外的尤为宝贵的体验。当然这个双路径的选择也和Microbit采用的nRF51822有关,由于16kRAM不可能同时容纳私有2.4G和Bluetooth,在SoftDevice的选择上必须二者中选择一个。所以对于初学者来说,如果不特别关注蓝牙特性的话,默认的runtime支持是在SoftDevice中选择私有2.4G的(这也是uBit的Radio为何支支持2.4G而不是蓝牙的原因)。 

回到蓝牙的话题,我们知道对于互相连接的两方或者多方蓝牙设备来说,连接建立在PHY的稳定可靠上,同时也建立在LL链路层的各状态切换上,连接建立前广播包的内容对于所有人都是可以解析的公开信息,而一旦连接建立,广播包就变成了只有建立连接的相关方才能解析的数据包了。更进一步,数据包的格式由基于通用属性协议GATT的profile描述而来。兰卡斯特大学的团队与蓝牙SIG的欧洲区技术大牛Martin Wooley一道,给出了下面的microbit蓝牙profile设计: 

Microbit的默认profile是围绕micrbit本体所具有的能力和特点来定义的。它并未就任何特别应用做定制,比方说电话或者视频控制方面,默认的profile是没有涉足的。当然,通过按键相关的Button Service来控制手机拍照,这当然也是可以通过一定的用户端软件实现的(与此相对的,另一种类似于蓝牙自拍杆的方式,其实是套用SIG采纳的Service)。 

所有的Service都是“主services”,所以服务均可被客户端发现和计数从而决定采用哪些服务。 

为了提高系统的易用性,器件的多数描述采用默认设置。 

GATT profile描述是基于Bluetooth Developer Studio工具开发的,该工具在www.bluetooth.com可免费下载使用 

在进入到profile之前,我们有必要对蓝牙配对机制做一个梳理--这也是蓝牙应用开发的一个重点环节 

 

蓝牙安全 

前面有讲到,一旦LL链路层建立连接,广播包就变成数据包,数据包对于连接双方以外的中间人都不可解析。microbit采用了下面的几种蓝牙安全选项: 

1. 通过密码配对和MITM保护或者通过代码配置“just Works”配对方式 

2. 白名单 

3. 对大多特性的操作采用加密的连接 

配对过程通过诸如AES128位加密的连接使得microbit与对端设备建立可信的安全。所有的牵涉到客户服务的部分(除开DFU)都必须采用加密的连接。任何时候只要需要,加密都会自动打开。如果对端设备未能和开启了安全操作的microbit配对,那么对端设备的请求通常将被拒绝,然后对端设备应当自动发起配对过程。 

白名只单允许已配对的设备与microbit连接。任何在白名单之外的设备的连接请求都会被蓝牙LL链路层忽略。 

广播 

处于“配对模式”的microbit将发起广播,或者之前已经配对/绑定那么器件将在LL启动白名单并发起广播 

在“配对模式”,microbit的广播标志位置位显示它储在可发现模式(LE通用可发现模式),如下图 

 

在“正常模式”(即,非“配对模式”)广播包既不会设定到LE 受限的可发现模式也不会设定LE通用可发现模式,在这种情况下,某些尚未与该器件配对的设备在蓝牙扫描列表中就无法看到该设备。 

配对 

通过microbit代码可以选择是否必须先配对才能获得蓝牙服务。如果选择了要求配对,那么下面的两种形式的配对都是可以的 

密码配对 - microbit会随机产生6位数字,并依次显示在microbit正面的LED阵列上,用户需要将看到的数字按序输入到对端设备,实现配对。 

Just Works配对 - 不要求输入密码就可以自动完成配对,只要配对模式正常发起,无需更多的用户交互即可完成配对过程 

为了和microbit配对,器件必须先进入“配对模式”。进入方式是,按住microbit的按钮A和按钮B,同时按下复位按钮。如果microbit是通过USB供电的方式,在放开复位按钮后,请继续保持按下按钮A和B。这样子就会令microbit进入配对模式,然后你会看到“PAIRING MODE”的字幕或者蓝牙图标显示在microbit上 

下一步,在对端发起配对。以WINDOWs系统为例,在控制面板设置-蓝牙和其他设备-打开蓝牙-添加蓝牙或其他设备-蓝牙,允许系统扫描并通过蓝牙发现在广播的设备。选择microbit后,开始配对。microbit会提示它准备好配对,并在LED阵列上显示一个指向按钮A的箭头。接下来的过程与你在microbit代码中选择的配对参数有关: 

密码配对:按下按钮A,6位数字将在LED阵列上依次显示。用户需要按顺序在WINDOWS配对界面的提示框中输入看到的6位数字,如果数字输入正确,microbit会在LED阵列上显示一个勾“✓”说明配对已完成。 

Just Works配对:按下按钮A,microbit和WINDOWS设备会自动配对,用户无需介入 

尽管每一次仅有一个配对的设备可以与microbit建立连接,microbit一次最多可以与4个设备进行配对。 

配对方式的选择 

上面说了配对的过程。那么究竟怎样选择是否配对,以及配对的方式呢 

重要提示!如果你决定无需配对就建立连接,你的蓝牙设备就失去了蓝牙安全机制的保护了。所有的通信都将公开,而且对于任何想要接入你microbit的设备都没有控制能力。由于microbit在作为周边设备时一次智能连接到一个对端设备,如果无需配对就可建立连接,那就意味着可能在你的目标中心设备和microbit建立连接之前,会有其他的设备与这个microbit先行一步建立了连接,这样你就不可能按自己的想法建立连接完成和microbit的蓝牙通信了。 


言归蓝牙配对的配置要求,该配置可以通过一个名为config.json的文件实现,该文件通常的位置是在source目录下可以找到。

而打开文件后,下面的这段就是配对的属性设置 

 

"microbit-dal":  

{ "bluetooth":  

 

"pairing_mode": 1,  

"open": 0,  

"security_level": "SECURITY_MODE_ENCRYPTION_WITH_MITM", }, } } 

Pairing mode控制是否能进入”配对模式”的开关。如果你想要能够配对你的microbit,这个开关应当保持开启 

Open 在0或者1直接取值,取值1表明你的器件不要求配对就可以建立连接,同时也表明系统的安全性设置Security_level将被忽略。该参数默认取值为0. 

Security_level 在SECURITY_MODE_ENCRYPTION_WITH_MITM(密码配对)或者SECURITY_MODE_ENCRYPTION_NO_MITM(just Works配对)间取值 

 

配对完成,建立连接后,GATT层的服务就可以被打开和使用了。由Martin开发的microbit runtime的GATT profile描述有下面的这些 (当然,开发者可以自己定义自己的蓝牙服务,Martin的工作给全球的开发者做了一个标准的范例): 



由于篇幅所限,这里就不全贴出来了。有兴趣的朋友可以通过下面的链接查看详细的profile定义https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html 

)。同时我还将把抽象层Bluetooth相关代码部分放在附件中供大家学习 


 



<未完待续> 

 




(0 ) (0 )
回复 举报

回复于 2019-07-03 沙发

感谢分享
(0 )
评论 (0) 举报

回复于 2019-07-03 2#

感谢分享
(0 )
评论 (0) 举报

回复于 2019-07-03 3#

谢谢分享
(0 )
评论 (0) 举报

回复于 2019-07-04 4#

谢谢分享!!!
(0 )
评论 (0) 举报

回复于 2019-07-07 5#

支持下,谢谢分享!
(0 )
评论 (0) 举报

回复于 2019-07-16 6#

感谢分享
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部