ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JDY-34蓝牙模块一从多主配置指南:从HC-05升级到双模透传

JDY-34蓝牙模块一从多主配置指南:从HC-05升级到双模透传 做蓝牙透传项目做到一定阶段很多人会被HC-05的一主一从限制逼疯从机只能连一台手机换绑定要重新进AT模式想组多节点网络基本无解。JDY-34这块蓝牙模块就是为了解决这些问题出现的它支持BLE 4.2和经典蓝牙SPP双模通过AT指令可以把角色配置成一从多主自动配对让一个从机同时服务多个主机也可以一主多从把整个组网灵活性提上来了。这篇文章会从选型逻辑讲起把接线、AT指令模式、一从多主的完整配置链路以及实测中容易踩的坑全部摊开讲适合正在做蓝牙透传、继电器控制、多节点采集项目的朋友直接参考。1. 为什么是JDY-34HC-05用户升级前必须知道的差异1.1 双模支持BLE和经典蓝牙SPP各司其职先说说JDY-34最核心的一个点双模。我之前用过HC-05它就是经典蓝牙SPP协议手机端如果是Android用蓝牙串口助手能直接连但换成iPhoneiOS系统对经典蓝牙SPP基本是锁死的你搜不到也连不上只能走MFi认证外设方案成本一下子就上去了。这也是很多人做蓝牙项目做到一半卡住的原因硬件没问题手机连不上。JDY-34支持BLE 4.2和经典SPP双模等于同时兼容两种场景。BLE部分手机端用nRF Connect这类工具扫一下就能看到不需要配对弹窗连接速度快也省电经典SPP部分可以兼容老的Android设备和一些工业主机。实测中我主要是用BLE模式和手机通信SPP模式留着和另一个老模块做兼容。对这个特性我有个建议如果你的应用场景以手机为主直接锁定BLE模式如果现场有老设备、必须在经典SPP下工作那JDY-34也能兜底。1.2 主从拓扑的灵活性一主多从与一从多主HC-05/06在出厂状态下一个从机只能被一个主机连接想一主多从抱歉固件不支持。HC-05的经典做法是主从角色切换切换后重新配对。你要做4个节点的采集网络就得买4对模块每组都配成主从还要处理信道冲突工程量大还容易串。JDY-34在这方面的可玩性就高很多。它支持一主多从一个主机可以轮询连接多个从机也支持一从多主一个从机可以同时连接多个主机。这在BLE协议栈里其实是多连接槽的概念——从机固件预留了多个连接槽允许不同的中心设备同时连上来。举个实际场景一套环境监测系统温湿度、气压、光照三个传感器节点各挂一个从机树莓派或手机当主机。配成一主多从后主机上电自动把三个从机都连上数据想怎么收就怎么收。反过来一个采集终端要同时向三台手机推送数据就可以把终端配成从机三台手机全连上来一从多主。你以为这就完了JDY-34的自由度还体现在它不限制你只在主或从里选一个有些固件版本支持主从一体模式模块既能连别人的从机也能被别的主机连。这个功能在复杂的组网场景里很省事但也要注意角色越灵活配置状态越容易乱后面我会专门讲到状态管理的问题。1.3 价格、功耗与上手成本说下大家最关心的成本问题。JDY-34模块单价一般在十几块钱上下浮动比HC-05便宜比HM-10也贵不了多少。功能多了价格没涨这也是它在我项目里能替换HC-05的直接原因。功耗方面BLE模式下的峰值功耗比经典SPP低如果固件支持睡眠模式实测待机电流能压到微安级。不过要注意低功耗模式和透传响应速度是一对矛盾你让模块睡死了主机连上来半天没反应体验反而差。我一般会在项目里把睡眠模式关掉或者是用MCU控制模块供电做硬开关需要传输再上电这样比模块自己睡可控得多。上手成本其实很低模块几个引脚就能跑通串口透传AT指令也就二十来条比HC-05那套按按键的旧操作逻辑友好不少。接下来我从接线开始把每一步都过一遍。2. 接线与AT指令模式别让第一步就翻车2.1 引脚定义与最小系统连接JDY-34的引脚不多核心是电源和串口外加一个状态脚和使能脚。我拿到的模块引脚定义如下你手里的版本可能略有差异但绝大多数一致引脚类型功能说明VCC电源3.6V~5.5V典型5V供电GND电源地线TXD输出串口发送3.3V电平RXD输入串口接收3.3V电平STATE输出连接状态配对成功后输出高电平EN / KEY输入使能/AT指令模式控制拉高后进入AT模式最小系统接法非常简单USB-TTL模块供电5VTXD接USB-TTL的RXDRXD接USB-TTL的TXDGND共地。不需要额外电路串口助手就能看到模块的广播和配对了。这里有个容易忽略的点USB-TTL如果用的是3.3V供电端子电流输出往往不够。蓝牙模块工作时电流几十毫安起步有些极简的USB-TTL板3.3V端子就是一颗LDO压降大、电流小模块会表现为上电后指示灯微弱一闪就灭了或者反复重启。所以我建议直接用5V端子供电串口电平3.3V没有压钢线问题。2.2 电平问题3.3V与5V的匹配JDY-34的串口电平是3.3V但很多MCU比如STM32的IO是3.3V可以直接对接Arduino Uno的ATE328P是5V逻辑51单片机也经常是5V逻辑。这时候直接连TXD/RXD长时间运行有风险。简单做法模块TXD接MCU的RXD方向是模块输出到MCU3.3V的输出进入5V的IO大多数08L CMOS输入都能识别高电平实际能用但MCU的TXD往模块RXD送数据5V的高电平直接灌进3.3V的引脚这就不太好了长期跑有烧模块的风险。稳妥的方案是在MCU TXD和模块RXD之间串一个分压电阻比如1k2k分压把5V降到3.3V左右或者用电平转换芯片成本也就一块钱。我自己的习惯是量产板上直接加一个TXS0102或类似电平转换调试阶段用串口助手因为它本身是TTL电平不会出问题。给小白一个建议如果你只是拿USB-TTL调着玩不用管电平一旦要焊到板子上和MCU通信电平匹配这件事一定要提前算进去。2.3 进入AT指令模式的方法与判断JDY-34进AT指令模式和HC-05不太一样不用按着按键不放。它的逻辑是EN引脚在上电时处于高电平模块就进入AT模式EN悬空或者拉低就进入透传模式。实际操作方法有两种。第一种模块上有按键就直接按住按键再上电第二种用一根杜邦线把EN引脚和VCC短接再上电AT模式下LED的闪烁频率会明显变慢这是最直观的进入成功的标志。判断AT模式是否生效用串口助手发一条AT波特率用9600返回OK就说明进对了。这里有个细节串口助手要勾选发送新行也就是在指令末尾带\r\n两个字符。不带换行的话很多模块会一直不回复不是没进去是它没收到完整的指令帧。AT模式下模块默认波特率是多少不同的固件版本可能不一样常见的是9600。你手里的模块如果是二手的就先把串口助手在1200到115200之间扫一遍总有一个波特率能返回OK扫到一次后就说明通信链路没问题了。3. 一从多主自动配对的完整配置链路3.1 地址与绑定自动配对背后的逻辑自动配对并不是魔法它建立在地址与绑定机制之上。每个蓝牙模块出厂时都有一个全球唯一的MAC地址JDY-34也一样。你可以用ATADDR?查到它返回的是一串16进制字符比如A4C138A5B011这种格式。这个地址就是模块的身份ID主机在配置时把目标从机的地址写进绑定列表下次上电时主机会主动扫描空中的蓝牙广播包如果发现某个从机的地址和绑定列表里的匹配就自动发起连接。这里有一个非常关键但容易误解的点自动配对≠不鉴权。连接建立时双方还要核对配对码PIN如果PIN不一致连接请求会被拒绝。所以一从多主虽然可以自动但前提是所有主机的PIN都要和从机一致或者从机的连接模式配置成允许任意地址连接。一句话总结地址决定我找谁PIN决定谁合法。这两层都通过了连接才成立。这也是为什么JDY-34做一从多主时你不需要人为干预只需要一次性把配置写对。3.2 从机端配置步骤我先从从机端开始配置因为主机需要从机的地址来绑定所以从机先上电。第一步进入AT模式。参考上面说的EN引脚拉高确认LED慢闪状态。第二步恢复默认设置。发ATRESET或者根据你手头手册执行恢复出厂目的是排除之前配置残留的干扰。我见过有人因为旧的配对记录导致新环境怎么都配不上恢复出厂后直接解决。第三步设置从机角色。发ATROLE0。角色值0一般代表从机1代表主机2代表回环测试不同固件可能略有差异以手册为准。第四步设置模块名称。发ATNAMEyyds_slave之类的方便你在手机或主机端识别。名称里不要用中文和特殊符号BLE广播名称长度也有限太长的名字会被截断。第五步设置配对码。ATPIN1234四个数字就够了这是主机连接时需要的凭证。注意这个PIN和经典蓝牙的配对码不一定完全等价在BLE模式下部分固件用固定的Just Works配对方式PIN可能只在经典SPP模式生效。以你手里的手册为准。第六步设置连接模式。这是整个一从多主配置里最关键的一步。ATCMODE0表示允许连接任何主机ATCMODE1表示只允许已绑定地址的主机。如果你要做一从多主让多个手机或主机都能连上来一般设ATCMODE0如果你只想允许指定的几台主机连就设CMODE1并把这几台主机地址都绑定进去。第七步复位。ATRESET从机重新进入透传广播状态。到这一步从机已经准备好了可以用手机扫描确认它在广播。3.3 主机端配置步骤与连接验证从机准备完成后开始配置主机。第一步让主机也进入AT模式。第二步查询并记录所有从机的地址。如果你是照着上面的流程配的现在用手机扫描从机的广播名从回报数据里能看到MAC地址或者直接在串口助手查ATADDR?。做一主多从时这一步要把所有从机的地址记下来后面一条条绑定。第三步设置主机角色。ATROLE1。第四步绑定从机地址。这个指令格式每个品牌差别比较大有的是ATBINDaddr有的是ATBINDaddr我在JDY-34上用的格式是不带等号的ATBINDA4C138A5B011。有些固件支持同时绑定多个地址写法是地址之间用逗号隔开。如果绑定多个这个模块就是一主多从如果你反过来想让一个从机服务多个主机那从机端按上一节的CMODE0配置即可。第五步设置连接模式。主机端建议设ATCMODE1只允许连接已绑定的地址避免主机乱连到别人家的设备上。第六步复位。ATRESET主机重启后会自动扫描并连接绑定列表里的所有从机。验证配对是否成功看两个地方。第一看STATE引脚连接成功后STATE引脚会从低电平拉高。第二看串口数据主机和从机之间建立透传后在一端串口发数据另一端能收到就说明链路完全跑通。这里有个我在实测中踩过的坑主机绑定地址时地址的字母大小写和空格必须精确比如A4C1后面如果有空格或者字符之间被加了一些不可见符号主机就会一直扫描不到目标。这个问题的排查很痛苦因为指令返回的往往还是OK。建议复制粘贴不要手输。4. AT指令深度解析关键指令的逐条拆解4.1 查询类指令先摸清模块底细拿到模块第一件事不是配参数而是先查清楚它是什么固件、什么地址、什么状态。查询类指令是调试的地基。AT指令返回OK表示基本通信正常。ATVERSION返回固件版本号不同的版本支持的指令集和参数范围会有区别。ATADDR?返回模块自己的MAC地址这个信息在做绑定配置时必须用到。还有些固件支持ATRSSI?查询当前连接信号强度对判断天线方向、距离问题很有帮助。我建议你每次拿到新模块先把这三条指令的结果存到记事本里注明模块编号。模块一多靠名称认设备会认错靠地址才是最稳妥的。做项目的时候我还会把每个模块的地址、角色、绑定关系做成一张表放进项目文档里调试的时候省了无数事。4.2 参数配置类指令名称、波特率、配对码名称、波特率、配对码是使用频率最高的配置项我把它们归为一组。ATNAME设置模块广播名称。指令格式一般是ATNAME后直接跟名称比如ATNAMEjdy34_test。改名称后旧的扫描结果会残留一段时间尤其是Android系统会缓存蓝牙设备名所以测试时如果扫描不到新名字先清一下手机蓝牙缓存。ATBAUD设置串口波特率。这个指令要用索引值不能直接填数字常见的对应关系是索引波特率112002240034800496005192006384007576008115200注意修改波特率后当前串口会立刻切换你必须在串口助手上改用新波特率才能继续通信。如果忘记改成了什么就只能在常见波特率里逐个试。ATPIN设置配对码。用于经典蓝牙PAIR和部分场景的鉴权。但这里我要泼一盆冷水BLE 4.2及以上默认使用LESC低功耗安全连接时简单的PIN码不一定生效而是要在手机端确认配对请求。所以做一从多主时不要指望PIN码能像以前HC-05那样严格把关安全敏感场景应该由上层协议做加密认证。4.3 角色与绑定类指令一从多主的核心这部分是一从多主的核心中的核心所以单独拿出来讲。ATROLE指定模块角色。0是从机1是主机2在某些固件里表示回环模式。一从多主的核心逻辑是这样的所有被连接的设备都设成从机角色它们对外广播所有主动发起连接的设备设成主机角色它们扫描、绑定、连接。JDY-34的从机可以同时接待多个主机前提是固件支持足够多的连接槽。我实测某版本固件能同时接3台手机再往下连第4台就不行了这个数量在买模块时最好向商家确认。ATBIND是绑定指令把目标设备的MAC地址写入模块。主机绑定了从机地址之后CMODE设置为1上电就会自动连目标。反过来如果你想让一个从机也能随时被多台主机连接从机端就要配合CMODE0允许任意地址连入。ATCMODE定义连接模式。0是任意地址回连1是仅连接已绑定地址。我自己的经验是一主多从场景下主机和从机全设CMODE1绑定关系明明白白不会乱连一从多主场景下从机设CMODE0主机设CMODE1绑定从机地址这样既可以保证只有白名单主机能连从机又不会锁死从机只能连一台设备。ATUUID用于设置BLE服务的UUID。手机端要连JDY-34做透传必须找到它广播的Service UUID和Characteristic UUID。默认值一般是FFE0/FFE1这类常见透传服务nRF Connect打开就能看到。如果你的项目用了自定义UUID主机端也要对应修改。4.4 AT指令速查表整理一张速查表供你调试时直接抄作业。再次强调不同固件版本指令格式可能不一样使用前务必查对厂商手册。指令功能说明示例AT测试AT指令通路AT返回OKATVERSION查询固件版本ATVERSIONATRESET复位重启模块ATRESETATNAME设置广播名称ATNAMEmy_devATBAUD设置串口波特率ATBAUD4ATPIN设置配对码ATPIN1234ATROLE设置主从角色ATROLE1ATADDR?查询本机MAC地址ATADDR?ATBIND绑定目标设备地址ATBINDA4C138A5B011ATCMODE设置连接模式ATCMODE1ATUUID设置BLE服务UUIDATUUID0xFFE0ATSLEEP进入睡眠模式ATSLEEP5. 实测中的常见故障排查链路与解决思路5.1 AT指令无响应先排除供电和串口问题AT指令发出去没反应这是最基础也最容易让人怀疑人生的问题。不要一上来就怀疑模块坏了按下面的链路排查。第一步看指示灯。如果灯不亮或者异常微弱先检查供电。用USB-TTL的3.3V端子供电失败率极高换5V端子尽量单独给模块供电。模块正常工作电流在几十毫安有的USB-TTL板子拉不动。第二步确认串口线接法。TXD接RXD、RXD接TXD很多人对着这个规则还是接错了原因是用了一根交叉线。我建议在调试时直接量一下模块TXD引脚在透传模式下有没有闲置电平变化如果模块TXD没有输出基本就是模块没工作。第三步确认发送新行。串口助手设置里勾上发送新行也就是\r\n。如果你用Putty或Minicom这类工具记得在串口设置里把“附加CR/LF”打开。第四步扫波特率。模块默认波特率如果被改过你用9600发AT当然没反应。把串口助手波特率从1200到115200依次切换每个波特率发一条AT直到某次返回OK。记住这个波特率以后都用它。第五步确认AT模式进入时机。EN引脚必须在上电时处于高电平如果模块在透传模式下重启后才拉高EN是不生效的。AT模式下LED慢闪这是最可靠的判断依据。5.2 一从多主连接不稳定的几种情况一从多主配置完之后连接会偶发断开或者延迟常见原因有三个。第一连接槽位耗尽。从机同时连接的主机数量接近固件上限后新的连接请求会被拒绝。解决方法是减少主机数量或者在主机端把没用的连接断开。第二广播间隔和数据冲突。多个主机同时从从机读取数据时BLE的数据传输是按连接事件轮询的每个主机的轮询间隔影响吞吐。如果你发现某一台主机数据特别卡检查它的连接间隔设置太长的连接间隔会拖慢数据流。第三天线和距离问题。JDY-34用的是板载天线对环境特别敏感。我之前把模块贴在金属外壳内侧连接距离从十几米直接掉到两三米还频繁断开后来把天线区域露出壳体才解决。如果现场结构不允许调整可以选带IPEX外接天线的版本。5.3 乱码与波特率不匹配收到串口数据是一堆乱码最常见的原因是波特率不一致。模块内部波特率和串口助手/MCU配置的波特率对不上数据采样点偏移就会出现乱码。排查方法先用模块默认波特率收发确认AT指令正常再查模块当前波特率设置如果可以的话用查询指令和你的代码里配置的波特率对比。改模块波特率之后代码里也要同步修改这个错误我犯过不止一次模块改了115200代码里还留着9600怎么看都是乱码。还有一种容易被忽略的乱码原因供电纹波太大。模块在数据传输时瞬时电流变化大如果电源滤波做得不好串口波形会变形。排查时在VCC和GND之间加一个100uF电解电容和0.1uF陶瓷电容很多“玄学乱码”直接就消失了。5.4 手机连不上模块的例外情况手机扫描不到模块或者扫到了连不上有几个例外情况经常出现。第一Android手机蓝牙缓存。模块改过名称或者被重置之后手机缓存里还留着旧记录导致显示的名称不对或者认证信息对不上。清掉手机的蓝牙缓存重新扫描。第二UUID不匹配。手机端BLE工具如果不支持查看自定义UUID的服务就会显示“No service found”或者根本什么都看不到。换用nRF Connect它会列出所有Service和Characteristic不会漏。第三模块进入了广播停止状态。部分固件在连接成功后不会再广播如果你把模块当从机用连接断开后需要等它重新进入广播状态如果模块“停在”某个不可见状态断电重启即可恢复。6. 应用扩展手机透传与继电器控制的落地做法6.1 手机端测试工具选择手机端测试JDY-34最常用的工具Android和iOS各有选择。iOS上我用得最多的是nRF Connect免费、能看到所有Service和Characteristic、还能改MTU虽然是Nordic出的工具但兼容通用BLE设备JDY-34完全能扫到。Android上常用的是“蓝牙串口助手”和nRF Connect蓝牙串口助手针对透传做了简化只要选对UUID就能收发。连接要点在nRF Connect里找到JDY-34的广播名点击Connect连接后在Service列表里找到FFE0打开FFE1对应的Characteristic先点“Enable notifications”这样模块发给手机的数据才能实时显示。发送数据就写在Write value的输入框里。这一步如果漏了Enable notifications很多人会以为模块只收不发其实只是你没订阅通知。这个细节在BLE调试里太重要了HC-05那种经典SPP是链路通了就双向通BLE必须主动订阅通知才能收到数据。6.2 控制继电器的简单协议设计手机通过JDY-34控制继电器本质就是透传一串数据给MCUMCU解析后驱动GPIO。但直接发个“ON”或者“1”这种方案在实际工程里不推荐原因有两个一是单字节命令容易被误触发透传链路里一次偶发错误就可能导致继电器误动作二是无法扩展你以后要控制多路继电器、多路传感器时没有帧格式的命令根本没法管理。我常用的简单协议是内容字节0字节1字节2字节3字节4意义帧头命令字通道号数据校验示例0xAA0x010x010x010x03帧头固定0xAA命令字0x01表示开关控制通道号1表示继电器1数据1表示开、0表示关校验是前4个字节累加和的低8位。开1路继电器AA 01 01 01 03关1路AA 01 01 00 02。MCU收到数据后先判断帧头再算校验校验通过才执行操作。这种帧设计非常简单但足以避免大部分误触发问题。MCU侧的解析注意一点不能一次性把整个帧接收完再判断因为蓝牙透传会把数据分包发送然后拼接。正确做法是用状态机一个字节一个字节地处理命中帧头进入接收状态攒够长度后校验校验通过执行命令再回到等待帧头状态。用状态机处理不定长的蓝牙数据是做过串口通信项目的人的基本功这里是最容易写错的地方。6.3 与MCU配合时的细节最后讲一下JDY-34和MCU配合时的几个细节。第一串口中断处理。JDY-34透传数据过来时MCU的串口中断会频繁触发。如果中断处理里做大量运算很容易丢数据。我的做法是中断里只把字节放进环形缓冲区主循环里再解析执行保证不丢包。第二流控问题。JDY-34多数版本没有硬件流控引脚意味着MCU端必须自己做好缓冲区管理。如果数据量大我建议用DMA接收配合空闲中断可以减少CPU占用。第三供电要求。JDY-34虽然在3.6V~5.5V都能工作但射频发射瞬间电流会跳变电源设计不好会引起模块工作异常。我一般在模块VCC脚加一个10-100uF的电容最好再串联一个磁珠把数字电路的高频干扰隔开。第四状态指示。STATE引脚在出厂时用来指示连接状态连接成功后是高电平。但需要注意这个脚在待机、睡眠状态下可能保持高阻态接MCU检测时要加上下拉电阻或者配置成内部下拉输入否则连接状态检测会是悬浮值误判率很高。这些细节看起来小但每一处都能在实际运行中省掉大量排错时间。我做的几套环境中早期版本总死在一些“看起来能跑”的环节上后面把电平、电容、状态脚这些补稳了整机基本不折腾了。到这里JDY-34的选型、接线、一从多主配置、AT指令和实际应用就都过了一遍。我自己的体会是这块模块把复杂的主从组网逻辑封装成了几条AT指令门槛确实低了不少但真正的难点不在指令本身而在你想清楚拓扑关系谁扫谁、谁连谁、谁绑谁把这三件事想明白再动手配置基本一次就能通。之前调一从多主时我卡得最久的一次就是在CMODE上从机设成了CMODE1结果第二台手机怎么都连不进来。后来反应过来一从多主的本质是“从机开放接入”必须用CMODE0来放行所有主机只靠主机侧绑定白名单来控制谁能连。这个逻辑反过来想其实很简单但没踩过坑的人确实容易在指令文档里绕晕。如果你手头的应用是蓝牙控制继电器或者多节点采集组网JDY-34这套方案可以直接拿来用。先把单个模块的透传跑通再配一从多主最后把协议层加上整个链路就稳了。祝调试顺利。
返回列表