草庐IT

一文搞懂蓝牙模块各种工作模式

Sharemaker 2023-04-21 原文

目录

前言

一、主设备工作模式

二、从设备工作模式

三、主从一体工作模式

四、广播者工作模式

五、观察者工作模式

六、iBeacon工作模式   

七、Mesh组网工作模式

总结


前言

        本文主要归纳总结蓝牙模块的不同工作模式,通过蓝牙模块不同的工作模式了解其扮演不同角色时工作的一个基本原理,为更深入的研究蓝牙模块底层的工作机制和技术方案进行铺垫。


一、主设备工作模式

        主设备是能够搜索别人并主动建立连接的一方,从扫描状态转化而来的。其可以和一个或多个从设备进行连接通信,它会定期的扫描周围的广播状态设备发送的广播信息,可以对周围设备进行搜索并选择所需要连接的从设备进行配对连接,建立通信链路成功后,主从双方就可以发送接收数据。例如智能手机,数据传输中做主机的蓝牙模块。

        一个蓝牙设备以主模式发起连接时,需要知道从设备的mac地址,配对密码等信息,配对完成后,可直接连接。同时主设备可以设置默认连接从设备的mac地址,这样主设备模块上电会自动搜索该mac地址的从设备并且进行连接。并且支持白名单功能,用户只需要把需要连接的设备的mac写入白名单中,模块搜索到符合白名单的设备时就进行连接。主从透传协议相同时,用户不需要关注串口数据与无线数据包之间的数据转换过程,只需通过简单的参数设置,即可实现主设备串口与从设备串口之间的数据透传。

        为保证连接的稳定性,预防断电、信号等异常问题导致模块之间断开连接,可以开启断线重连功能,当异常干扰问题消失,模块工作环境恢复正常,主设备会自动搜索刚刚断连的从设备,尽可能减少数据的丢失,提高系统稳定性。


二、从设备工作模式

        从设备模式是从广播者模式转化而来的,未被连接的从设备首先进入广播状态,等待被主机搜索,当主机扫描到从设备建立连接后,就可以和主机设备进行数据的收发,其不能主动的建立连接,只能等别人来连接自己。和广播模式有区别的地方在于,从设备模式的蓝牙模块是可以被连接的,定期的和主机进行连接和数据传输,在数据传输过程中作从机。例如蓝牙手表手环,蓝牙鼠标等工作在从设备模式。

        一对一应用中从设备可以设为两种类型,一是静默状态,即只能与指定的主设备通信,不被别的蓝牙设备查找;二是开发状态,既可被指定主设备查找,也可以被别的蓝牙设备查找后建立连接。

        从设备模式下,用户可以根据协议自己开发APP。此模式下包含一个串口收发的Service,用户可以通过UUID找到它,里面有两个通道,分别是读和写。用户可以操作这两个通道进行数据的传输。如果用户使用的主设备和从设备是同一个厂家生成的蓝牙模块,那么主设备和从设备相连接可以无需关注里面的协议,蓝牙设备在出厂前预先设置了两个蓝牙设备之间的配对信息,两端设备接通电源后自动构建链路,不需要外围电路的介入,两个设备的串口直接就可以进行数据的透明传输,为用户建立一个简单的无线传输通道。

        通过上述对蓝牙模块主设备模式和从设备模式的分别阐述,可以将基本的主从建立连接的过程总结如下:蓝牙主设备发起连接,首先是查找,找出周围处于可被查找的蓝牙设备。主设备找到从设备后,与从设备进行配对,此时需要输入从设备的PIN码,也有设备不需要输入PIN码。

        配对完成后,从端蓝牙设备会记录主端设备的信任信息,此时主设备即可向从设备发起连接,已配对的设备在下次连接时不再需要重新配对。已配对的设备,作为从端蓝牙设备也可以发起建立链路的请求,但作数据通信的蓝牙模块一般不启动调用。一旦建立了链接,主机和从机之间就可以进行双向的数据或语音通信。在通信状态下,主设备和从设备都可以发起断链,即断开蓝牙链路。


三、主从一体工作模式

        主从一体工作模式是指蓝牙模块可以同时作为主设备和从设备。其可以在两个角色间切换,工作在从模式时,等待其它主设备来连接,需要时,转换为主模式,向其它设备发起连接调用。主从一体提供了扩展蓝牙模块的能力,在蓝牙4.1协议规范后,添加了“链路层拓扑”的功能,就可以允许蓝牙模块同时作为主设备和从设备,在任何角色组合中操作。例如蓝牙HUB终端。

        当具备主从一体的蓝牙模块工作时,该蓝牙模块可以作为主设备搜集其它外围从节点设备的信息,同时作为一个从设备将搜集到信息上报给主控终端如手机。这样的好处就是外围的从节点设备信息可以不局限在本地保存,通过主从一体的蓝牙模块发挥中继器的作用,搜集后上传给云端或集中控制器保存或显示。

        主从一体额外增加了蓝牙模块的功能,成本优化和易用性。 如果蓝牙模块以前在封闭系统中作为主设备工作,那现在还可以同时作为从机连接到智能手机,从而实现新的连接维度。在主从一体工作模式下,一个蓝牙模块就可以扮演两种角色,从而可以优化系统架构。


四、广播者工作模式

        蓝牙广播是蓝牙4.0以上设备必须支持的功能。它不涉及到更上层的连接层和协议层。因此,利用蓝牙广播的数据包来传递的信息,在蓝牙设备上具有更好的实时性和兼容性。在广播模式下,蓝牙模块定期持续的向周围发送一定长度广播的数据包,该数据可以被扫描者搜索到,模块可以在低功耗的模式下持续的进行广播,应用于极低功耗,小数据量,单向传输的应用场合。蓝牙广播通道的重要功能就是是用于发现设备,发起连接和发放数据。

        广播模式主要有两种使用场景:(1)单一方向的、无连接的数据通信,数据发送者在广播信道上广播数据,数据接收者扫描、接收数据;广播者”将用作服务器。其目的是定期将数据传输到设备,但不支持任何连接。如信标、广告牌、室内定位、物料跟踪等。(2)面向连接的建立,如蓝牙从设备广播消息后由主设备搜索到后进行连接,广播者和从设备模式的唯一区别是不能被主机连接,只能广播数据。

        蓝牙的广播一般是向外广播自己的mac地址、名称以及支持的特性,广播主要是用于被其它的设备发现,而不是进行数据发送的。广播包长度是固定的字节,虽然可以有厂商自定义的数据,但是数据也是有限的。

        广播数据包有两种:广播包(Advertising Data)和响应包(Scan Response),其中广播包是每个设备必须广播的,而响应包是可选的,每个包长度都是固定字节N,数据包的长度N随着蓝牙协议的标准提高而扩容,例如蓝牙5.0的数据包从蓝牙4.2的31字节升级成为255字节,数据包中分为有效数据和无效数据两部分。每个广播包的长度必须是N个字节,如果不到N个字节 ,则剩下的全用0填充补全,这部分的数据是无效的。


五、观察者工作模式

         观察者模式,该模式下模块为非连接,相对广播者模式的一对多发送广播,观察者可以一对多接收数据。在该模式中,设备可以仅监听和读取空中的广播数据。和主机唯一的区别是不能发起连接,只能持续扫描从机。

        观察者工作模式可应用于数据采集集中器的应用场合,如传感器集中器采集等功能;另一个典型的例子是蓝牙网关,蓝牙模块处于观察者模式,无广播,它可以扫描周围的广播设备,但不能要求与广播设备连接。


六、iBeacon工作模式   

        iBeacon 是苹果公司2013年9月推出的一项室内低耗能蓝牙技术。其工作方式是:iBeacon是一个低功耗的蓝牙信标,使用的是BLE技术,工作在广播模式,利用的是BLE中名为“通告帧”(Advertising)的广播帧。通告帧是定期发送的帧,只要是支持BLE的设备就可以接收到。广播的发射功率可以调整,不停的广播蓝牙设备的mac地址、UUID等固定字节的字符串等信息,接收到该字符串应用软件会根据该字符串采取一些措施。

        iBeacon是基于2010年发布的蓝牙4.0技术规范的基础上发展而来的微定位技术。它是建立在低功耗蓝牙协议基础上的一种广播协议,同时它也是拥有这个协议的一款低功耗蓝牙设备(从机),但是它不能和任何低功耗蓝牙主机进行连接,通常是放在室内的某个固定位置,借此向周围进行连续性广播,所有广播数据在特定规则下进行排列。

        与WIFI定位相比,iBeacon定位具有低成本和高安全性,其应用场景多种多样。常见的应用是精确营销,比如博物馆、展厅的信息推送或者购物中心服务商向顾客发送折扣卷及进店积分等。如果把它放在室内固定的位置,可以作为一个定位器,手机打开蓝牙连接之后通过APP就可以获取其位置,同时会推送一些设置好的信息到我们手机上。

        微信摇一摇也加入了iBeacon功能,例如住酒店,用户在酒店大堂摇一摇,就可以获取房间信息。很简单,你的手机加入装了一个支持iBeacon的APP或者你用微信摇一摇周边,刚好你又在这个iBeacon设备旁边,手机就会收到一段蓝牙信号,然后手机带着这个信号,去服务器问,这个信号是啥意思,服务器看到这个信号,又看到是你的手机带着这个信号过来的,那就给你发信息。

        蓝牙iBeacon是一种非常新颖的交互方式,它是一种低功耗协议,也是一种低功耗蓝牙设备,在智能领域有非常广泛的前景。


七、Mesh组网工作模式

        蓝牙Mesh组网技术在2017年得到SIG批准,这是一种独立的网络技术,兼容4及5系列蓝牙协议。它把蓝牙设备作为信号中继站,利用低功耗蓝牙广播的方式进行信息收发,蓝牙Mesh技术拓展了蓝牙的通讯关系,打破了以往蓝牙设备只能够主从一对一、广播一对多通信的限制,使网络内的蓝牙设备可以实现“多对多”的设备通信,这将大大增加蓝牙的通讯距离和应用场景,填补了蓝牙在大规模组网,大面积覆盖应用领域的空白。

        Mesh网络也称为"多跳网络",或者“网状网络”。Mesh网络的每一个节点都可以作为AP和路由器,通信时,当某个节点损坏或者堵塞时,可以自动绕过该节点,重新选择路径达到目的地,可以让网络更高效可靠。

        工作在Mesh组网模式的BLE蓝牙模块可以简单的将多个模块加入到网络中来,一个加入到蓝牙Mesh网络中的设备称为节点利用星型网络和中继技术,每个网络可以连接理论最大65536个节点,每个节点都可以发送、接收、转发消息。消息可以在Mesh网络中被转发从而到达更远的距离。网络和网络还可以互连,最终可将无数蓝牙模块通过手机、平板电脑或 PC 进行互联或直接操控。并且不需要网关,即使某一个设备出现故障也会跳过并选择最近的设备进行传输。整个联网过程只需要设备上电并设置通信密码就可以自动组网,真正实现简单互联。

        由于目前几乎所有的智能手机都具备蓝牙功能,所以可以使用手机对蓝牙Mesh设备进行直接控制。蓝牙Mesh是一种可以像ZigBee一样实现大规模组网,同时又不必依赖网关,可以使用手机进行直接控制的方案。

        总而言之,蓝牙Mesh组网有着广阔的发展前景,这种技术可组节点成百上千,无需网关可以直接与智能终端通信,满足物联网的连接需求,这是任何其它短距离无线技术都不具备的条件,在智能家居、智能建筑等众多领域具有应用优势,蓝牙Mesh技术将成为物联网短距离规模组网的最优方案。


总结

        可以看出,不同类型的蓝牙模块根据使用场景的不同,可以有不同的工作模式,并不仅仅是简单的点对点通信,随着蓝牙协议标准的升级,蓝牙技术也跟着不断提高,工作模式的不同使得蓝牙模块可以扮演不同的角色,适配不同的技术应用,发挥其所需要的功能,最后通过一张思维导图来对本文进行概述性总结。


↓↓↓更多技术内容和书籍资料获取敬请关注“明解嵌入式”↓↓↓

有关一文搞懂蓝牙模块各种工作模式的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  8. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  9. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  10. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

随机推荐