硬件部
蓝牙读卡器是在蓝牙低功耗BLE协议栈上开发的。协议栈是TI公司发布的SDK软件包,SDK封装了一般应用场景的需求,完成应用开发的80%,剩下的20%则以回调(callback)和接口的方式给应用开发人员调用以完成具体的需求。
蓝牙BLE单芯片的系统架构包括操作系统、SOC硬件抽象接口和蓝牙应用框架等组成部分,而我们基本关注蓝牙的连接和通信的控制。前者即对应GAP(General Access Profile),后者对应GATT(General Attribute Profile)。手机APP所用的蓝牙一般充当central角色,即主设备,我们的蓝牙设备充当Peripheral角色,即从设备。
连接部分,蓝牙外设要被发现,其必须要进行广播,在主设备扫描时要给出扫描响应。这时蓝牙设备还是处于广播状态。主设备发起连接时,其可以要求密码配对,也可以选择无需密码验证。主设备发起连接过程的握手,接受连接。蓝牙外设连接成功后才会开启通信服务。通信控制,蓝牙外设在连接后通过GATT来提供服务发现(service discover),这样主设备能够从中获取蓝牙外设提供的各种服务profile。主设备在获取蓝牙外设服务后,会对GATT profile的各种特征字(characteristics)进行读写传输控制。特征字主要包含write、read、notify和indicate等主要通信方式。对于蓝牙外设的write特征字,主设备(如手机)可以进行写操作;对于read,主设备则可以从中读取信息;write和read对于蓝牙外设来说,属于被动控制,即蓝牙外设被动接受主控制的通信控制。而notify和indicate则是蓝牙外设主动向主设备传输数据,前提是主设备要预先订阅对应的characteristics的信息更新。Notify数据后,主设备不需要应答响应,而indicate则需要应答响应。
蓝牙BLE有自己的协议标准,一个蓝牙服务service包括一个或者多个characteristics,而每个characteristics都包含对应UUID、属性描述(如可读、可写、长度等)、属性值value、属性配置(代表订阅信息)等等,通过配置和修改蓝牙服务的各种特征字就可以实现主,从设备之间的数据传输。