美文网首页
被玩坏了的 Android Bluetooth

被玩坏了的 Android Bluetooth

作者: 大大世界 | 来源:发表于2016-06-13 00:24 被阅读1087次

    这里的一切都是站在一个上层应用开发者的角度去理解蓝牙,做一些形象的比喻,帮助理解整个蓝牙通信流程。(PS:初稿需要修改)

    比划下协议栈

    协议栈这个东西按照字面意思解:
    协议表示事先已经约定好了
    表示分层的意识
    协议栈表示 已经约定好的分层通信模型

    stack.png

    一个简单的例子:
    应用层 这里定义里通俗的通信语言(假设应用层发送 Hello
    逻辑链路层这里表示已经经过事先约定好的模型处理过的上传数据(Hello已经处理为0x48,0x65,0x6C,0x6C,0x6F
    物理层这里表示传输的物理媒介,例如电缆,无线电等(这里已经变成了带有高低电平的无线波信号)

    蓝牙通信模型

    蓝牙通信的模型其实可以看成一个标准的B\S架构。
    即存在蓝牙服务端和蓝牙客户端。

    HeadSet Profile

    蓝牙耳机协议:
    服务端: 带有蓝牙功能的手机
    客户端: 蓝牙耳机

    打电话时手机通过蓝牙发送音频信号给蓝牙耳机。

    Synchronization Profile

    这个协议可以传输文件。
    服务端: 蓝牙手机A
    客户端: 蓝牙手机B

    手机A通过蓝牙分享一个文件到手机B。

    总结:

    Bluetooth定义了9种应用(usage)Profile。
    CTP Profile: Cordless Telephone Profile,无绳电话。
    IP Profile: Intercom Profile,这是在两个设备之间建立语音连接,换句话说,把两个昂贵的蓝牙设备变成廉价的对讲机。
    HS Profile: HeadSet Profile,用于连接耳机。
    DNP Profile: Dial-up Networking Profile,用于为PC提供拨号网络功能。
    FP Profile: Fax Profile,传真功能。
    LAP Profile: LAN Access Profile,使用PPP协议建立局域网。
    OPP Profile: Object Push Profile,用于设备之间传输数据对象。
    FTP Profile: File Transfer Profile,用于文件传输。
    SP Profile: Synchronization Profile,用于不同的Bluetooth设备同步,保持数据的一致性。
    
    Bluetooth定义了4种是基本的Profile,这些Profile会被其它的Profile使用。
    GAP Profile: Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。
    SDAP Profile: Service Discovery Application Profile,通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以及查询相关的信息。
    SPP Profile: Serial Port Profile,模拟串口通讯
    GOEP Profile: Generic Object Exchange Profile,通用对象交换。这个Profile的名字有些费解,它定义的是数据的传输,包括同步,文件传输,或者推送其它的数据。你可以把它理解为内容无关的传输层协议,可以被任何应用用来传输自己定义的数据对象
    。
    

    蓝牙的Profile都可以看成B\S架构。 GAP可能不太好用B\S解释。

    说说蓝牙协议栈如何实现的

    有了上面的知识, 再去理解下协议栈是来干什么的。

    服务端

    启动一个监听,监听的话肯定需要一个内容, 蓝牙标准化了这个内容, 使用UUID表示。
    HCRPrintServiceClass_UUID = '{00001126-0000-1000-8000-00805F9B34FB}'

    客户端

    发起一个请求, 请求总需要一个目标, 这个目标就是UUID.

    协议栈

    就是起到一个封装解析并传递数据的作用。

    举个例子:(服务端【B】 客户端【C】)
    1:C发给B: 01
    2:B收到, 协议栈去解析01(假设是询问服务端是否准备就绪)
    3:B返回C:01
    4:C收到, 协议栈去解析01(假设是表示服务端准备就绪)
    5:C认为B已经OK, 继续发送数据

    Android Bluedroid

    Bluedroid是Android上的蓝牙协议栈, 这个协议栈, 默认已经实现了很多的基础的Profile。
    OPP, PBAP 这两个协议是纯上层 Bluetooth.apk 实现的。
    原理也很简单, APP启动一个 BluetoothServerSocket 监听相应的UUID, 假设请求到来的话, 直接把数据转到上传APP层处理。

    蓝牙玩个新花样

    有了上面的知识后, 自己就可以实现一个手机上未实现的Profile。
    我这里实现了一个

    #蓝牙串口服务
    SerialPortServiceClass_UUID = '{00001101-0000-1000-8000-00805F9B34FB}'
    

    这个东西实现之后, 就可以把手机当成一个蓝牙打印机使用了, 已经成功的连接了各大外卖平台, 可以让它们把数据直接发送到手机上。

    相关文章

      网友评论

          本文标题:被玩坏了的 Android Bluetooth

          本文链接:https://www.haomeiwen.com/subject/nziedttx.html