iOS蓝牙Mesh开发总结一

6,409 阅读6分钟

蓝牙Mesh

前言

不知不觉间做蓝牙开发已经一年时间了,从最开始的系统BLE(低功耗)蓝牙到云端蓝牙OTA再到现在的蓝牙Mesh。本篇文章主要用来记录总结蓝牙Mesh开发流程及开发中遇到的一些问题,同时也尽可能的给正在开发iOS蓝牙Mesh的小伙伴们提供一些帮助。

蓝牙Mesh的概念

有关蓝牙Mesh概念方面的问题我想你已经在此之前就已经了解过了,毕竟百度上有一大堆的CV概念,这里就不再赘述了。如果没有了解过的话建议可以看看这里蓝牙Mesh概念

iOS如何开发蓝牙Mesh?

使用第三方库,推荐Nordic公司在GitHub上的iOS-nRF-Mesh-Library开源库。目前这个库的第二版已经完成,所以也就不用再关心第一版有多恶心了🤮。
虽然第二版相对于第一版要好很多,但使用过程中还是可能存在一些问题:

  • 这个库使用的是swift语言开发的,对于使用OC开发的人来说可能不是很友好,搞过混编或者了解过swift语言的应该都知道OC的内容基本上swift都已经能够支持了,但swift中有些东西OC是无法支持的,比如:结构体、枚举类型。
  • swift语言开发framework时若要支持OC则要在公有类或方法前添加@objc关键字,遗憾的是这个库没添加。

因此建议开发者如果对swift语言比较熟悉建议使用swift开发蓝牙Mesh,使用OC开发则必不可免的要改第三方库的代码了,具体怎么使用自己斟酌吧。

iOS开发蓝牙Mesh要做什么?怎么做?

这一点很重要,刚开始要做蓝牙Mesh的时候,在百度上搜iOS蓝牙Mesh相关的内容根本搜不到,能搜到的都是一群CV大法讲解蓝牙Mesh是什么,干什么的?也就是上面说的蓝牙Mesh概念,看完了还是不知道我们iOS到底要做什么,怎么做?
不过不用担心,看完了这个文章,你就知道iOS在做蓝牙Mesh的时候要做哪些功能,要怎么开始做了。

还是要先说一下概念

  • 节点:所谓节点其实就是蓝牙设备,在配网之前叫设备,配置到Mesh网络中后就改名叫节点了,至于节点有什么特性这不是我们做iOS的能决定的,这要看硬件工程师怎么烧的代码了。

  • 四大节点:中继节点、代理节点、低功耗节点、朋友节点。但作为iOS开发我们不用管那么多,在意一下代理节点就行,因为我们手机发送的所有指令基本都是通过代理节点转发的。

  • 创建网络:所谓创建一个Mesh网络,说的简单点就是初始化一些网络的配置信息,如:网络的唯一标识(meshUUID)、消息传输密钥(AppKeys)等关键信息。至于创建完之后要将信息保存在哪就要根据实际情况了,那个第三方库是默认保存在本地的,我们在做的时候是将网络信息保存在了云端,这样方便将用户和Mesh网络进行绑定。

  • 手机在蓝牙Mesh中扮演的角色:手机在Mesh网络中主要的作用是配置器,其次手机也可以算是Mesh中的一个特殊的节点,因为手机可以和网络内的任意一个节点通信,特殊性就体现在手机只能在连接到代理节点的时候才能和其他节点通信。

  • 配网:配网是一系列操作的统称,这一系列操作达到的目的就是将一个支持蓝牙Mesh的蓝牙设备添加到手机创建的Mesh网络中。

上面我们知道了配网的概念,接下来说一些配网的具体内容,配网总体上分为5个步骤:

  • 第一步:支持蓝牙Mesh的设备在配置入网前有一个UUID是1827的服务,这个服务下有两个特征,一个读一个写。蓝牙设备会持续的发送广播包供手机搜索。手机通过iOS系统库CoreBluetooth里面提供的蓝牙扫描方法扫描拥有1827UUID的蓝牙设备,扫描到之后建立连接,发现服务特征,订阅蓝牙设备读特征。
  • 第二步:在第一步的基础上向蓝牙设备发送邀请信息、邀请这个设备加入Mesh网络。设备收到邀请信息后会将自身的一些信息发送给手机,如:设备的元素个数,元素种类,公钥类型、加密算法等。
  • 第三步:在第二步的基础上既然郎有情、妾有意,那么接下来就是要交换定情信物(公钥)了。
  • 第四步:定情信物都交换了,马上就要在一起了,还是再测试一下对方是不是真心的比较好,毕竟现在后悔还来得及,于是就有了这一步随机数认证环节,类似于密钥确认。
  • 第五步:认证通过之后,总要让新来的设备拥有一些名分啊,就需要给设备分配一些数据,如:设备单播地址、netKey、keyIndex、ivIndex这些。 哈哈,设备配网完了才发现Mesh网络内并不只有这一个设备,可是后悔也晚了,手机实属是个渣男。

已经说了配网的步骤,那我们iOS在写代码的时候不会要把每一个步骤都自己实现吧?当然不会,那不是有第三方库嘛。上面那个第三方库已经帮我们把配网的5个步骤封装了好多了,第一步扫描设备这部分的实现是在官方的demo中写的,第二步使用ProvisioningManager对象调用identify方法即可。后面的三步封装到一个方法里面了,ProvisioningManager类中provision方法。

说到这里你应该已经大概知道我们iOS开发在开发蓝牙Mesh时应该要做哪些内容了吧?我再总结一下,我们在开发蓝牙Mesh时需要做的基本上有以下三点:

  • 创建一个Mesh网络
  • 给这个Mesh网络配置节点
  • 手机给Mesh网络内的节点发送消息或指令。

大体上总结下来我们iOS要实现的功能就这三点。是不是要问我怎么就说了前两点,发消息怎么不说说怎么做?别急,让我缓缓,有关消息这一块的内容比较多,在下一篇文章中再慢慢道来吧。