1. BLE蓝牙地址:不只是六个字节那么简单
做IoT和自动化测试这几年,被问到最多的问题就是"BLE怎么老连不上"和"魔方蓝牙MAC地址怎么设置"。我把这些问题的原因追到底,发现七成都在蓝牙地址上。BLE设备之间能不能连、认不认得出对面是谁,很大程度都压在蓝牙地址上。而一旦设备数量多起来,天天手工改地址、填配置表,人会被逼疯,这时就该RPA上场了。这篇文章想把BLE蓝牙地址的底细和RPA实战完整过一遍,既有原理也有能直接抄的步骤,适合刚接触BLE开发测试、以及想用自动化工具摆脱重复劳动的工程师。
1.1 公共地址与随机地址,BLE设备身份的两张牌
蓝牙设备地址和网卡MAC地址一样,都是48位,也就是6个字节,平时我们看到的形如D4:36:39:AB:CD:EF这种格式。按蓝牙核心规范,BLE设备地址分成两大类:公共地址(Public Device Address)和随机地址(Random Device Address)。
公共地址的逻辑最好理解,前半部分是IEEE分配给你的厂商识别码OUI,后半部分你自己随便编,组合起来全球唯一。这类地址和Wi-Fi网卡的MAC没有本质区别,适合正规量产、需要明确追溯厂商的设备。但它有个现实问题:OUI是要花钱申请、走流程的,很多小团队拿不到,或者不想在这上面花精力,于是就有了随机地址。
随机地址不是随便乱写那么简单,它内部还分三种,我工作中经常有人搞混:
| 地址类型 | 最高两位 | 变化规律 | 典型用途 |
|---|---|---|---|
| 静态随机地址 | 11 | 每次开机可能变,但本次运行周期内不变 | 普通BLE外设、匿名设备 |
| 不可解析私有地址 | 00 | 周期性随机变化,无法被对端反查身份 | 广播信标、一次性连接场景 |
| 可解析私有地址 | 01 | 周期性变化,但有IRK密钥的设备可以解析出真实身份 | 手机、手表、需要隐私保护的设备 |
可解析私有地址是BLE隐私保护的核心机制。设备用本地保存的身份解析密钥IRK,结合随机数生成一个看起来每次都不一样的地址。已经配对过的设备收到这个地址后,用自己的IRK做一次哈希匹配,能认出"哦,还是原来那个它"。没配对过的设备看到的就是一串天天变的乱码,没法跟踪。
理解了这些,你再看"手机蓝牙MAC地址为什么会变"这个问题就通了。手机为了防跟踪,默认用可解析私有地址,不是你设备出了问题,是协议本身在保护你的隐私。做自动化测试时最怕这个,因为今天记录的地址,明天连不上,跑到脚本里就是一堆莫名其妙的失败。
1.2 BLE连接建立过程:地址在哪个环节起作用
蓝牙地址不是只用来显示好看的,它在BLE连接建立的过程中是实打实的参与者。BLE工作在2.4GHz频段,物理信道上一共40个信道,其中37/38/39三个信道专门做广播。设备间的连接过程大致是:广播者(Peripheral)周期性地在广播信道上发送广播包,扫描者(Central)在同一个信道群上扫描,收到广播包以后如果想建立连接,就发送一个连接请求CONNECT_REQ。
CONNECT_REQ这个报文里就带了两个关键地址字段:一个是发起者地址(InitA),也就是连接方的地址;另一个是广播者地址(AdvA),也就是被连接设备的地址。双方地址对了,连接参数也匹配,连接事件才能建立起来。所以你的设备地址如果类型不对、前缀非法、或者被白名单过滤了,根本走不到连接那一步。
扫描端还可以配置白名单(White List),只让指定地址的设备触发扫描结果或连接事件。这在多设备同时广播的环境里非常有用。你拿着开发板在办公室做调试,周围一堆人都在开BLE广播,如果没有地址过滤,你的扫描列表里全是别人家的设备,找起来眼睛都要花。反过来,如果你的设备地址是重复的,或者每次上电就变,白名单就形同虚设。
我在Linux下最常用的排查命令还是bluetoothctl。scan on开启扫描,devices就能看到设备地址和名称。有时候名称显示不出来,但地址一定在。手机上用nRF Connect,扫描结果第一列也是地址。看地址类型也有技巧:公共地址一般以IEEE OUI开头,比如D4:36:39这种,看着像正规厂商;随机地址开头就会五花八门,尤其是最高两位为11的静态随机地址,往往是一堆看起来不太"规整"的数字。
1.3 实战:魔方蓝牙MAC地址怎么设置
"魔方蓝牙MAC地址怎么设置"这个问题,隔段时间就有人问一次。这里说的魔方,我理解是指某类需要用蓝牙连接的智能硬件,比如带蓝牙的智能魔方、魔方网关、或者开发者手里的BLE模组开发板。说到底,就是想把设备的蓝牙地址改成自己指定的值。这种需求在生产测试里太常见了,几十台设备用同一个固件,如果不改地址,手机一扫描全是同名同MAC的"孪生兄弟",根本分不清谁是谁。
设置BLE MAC地址,最典型的方式是下面几种:
第一种是AT指令。很多国产BLE模组出厂固件自带串口AT指令,比如AT+ADDR=xxxxxxxxxxxx。不同厂商的指令格式略有差异,但思路一样。你通过串口把目标MAC发给模组,模组写入Flash,断电之后仍然生效。这种方式最适合产线,夹具一上,串口一开,发一条指令就好。
第二种是SDK接口。如果你的固件是自己写的,比如用ESP32、Nordic、Dialog这类平台,直接在代码里调用地址设置接口。ESP32上常用esp_ble_gap_set_rand_addr(),Nordic上用sd_ble_gap_address_set()。需要注意,如果你要设置的是随机地址,地址的两个最高位必须符合我们前面说的类型标识。比如要设置静态随机地址,最高两位就得是11,否则协议栈可能会拒绝或者行为异常。
第三种是量产工具。正规一点的模组厂商会提供PC端的量产烧录软件,里面一般都有"修改MAC地址"的选项,导入CSV,点一下启动,流水线自动写地址。如果你手头设备少、又不想自己写代码,这种工具最省事。
不管用哪种方式,写完地址后一定要重启蓝牙协议栈并重新开启广播,再拿手机或者bluetoothctl扫一下,确认地址真的变了。我遇到过很多人改了地址但忘了重启广播,扫出来的还是旧地址,就以为设置失败了,其实是没生效。
1.4 地址相关连接坑:从一次反复断连的诡异问题说起
有一次我们测试一批ESP32设备,其中一台总是连上几秒就断,再连又断,日志里全是连接超时。排查了半天,最后才发现那台设备的随机地址每次复位都会变。手机端在后台缓存了第一次配对时的旧地址,而设备复位后换了新地址广播,两边对不上,连接自然就失败。
这个坑在开发阶段特别容易踩,因为很多开发板默认的随机地址并没有做到"每次烧录固定",而是上电时从随机数寄存器里取一个。如果你的App没有处理好"按名称匹配、地址只做参考"这个逻辑,就会莫名其妙连不上。解决方法是:要么在固件里把静态随机地址固定下来,要么在App端连接时把设备名称也作为判定条件,别只认地址。
还有个坑是公共地址重复。有些山寨厂商图省事,所有设备烧录同一个公共地址,结果就是手机扫码扫出一堆同名同MAC的设备,你以为连接的是A,实际可能连上的是B。这种问题在产线测试中最致命,用RPA做自动化时也最容易翻车,因为脚本按固定地址找设备,找到的却可能是另一台。批量修改设备地址这个需求,就是这么来的。
另外,有朋友问过ESP32轻度睡眠状态下BLE还能不能广播。实际上light sleep下BLE控制器可以继续跑,但广播间隔可能被拉长,唤醒后也可能重新初始化地址。如果你用RPA脚本控制测试流程,扫描等待时间一定要留够,别把设备的慢广播当成离线。
2. RPA是什么,为什么蓝牙场景会用到它
讲完地址,咱们把RPA这层窗户纸捅破。RPA全称是Robotic Process Automation,翻译过来叫机器人流程自动化,但别被"机器人"三个字吓到,它本质上就是软件层面的"按键精灵"加满血版。你平时在电脑上怎么操作,它就可以怎么操作:打开软件、移动鼠标、点击按钮、输入文字、读取屏幕、读写Excel、访问网页,全都能做。核心价值就一句话:把重复、规则明确、跨系统的人工操作,交给脚本机器人去跑。
2.1 RPA的核心思路:让软件机器人替你干苦力
为什么很多人第一眼看到RPA觉得"这不就是自动化测试工具吗"?理论上有重叠,但RPA更偏业务操作层面,不要求被控制的系统有什么接口或二次开发能力。它工作在用户界面层,靠识别按钮、输入框、表格位置来操作。这意味着哪怕对方是个十几年前的老旧管理系统,没有任何API,你也能让RPA像人一样登录、查询、录入、提交。
拿一个最普通的场景举例。你手上有一份Excel地址表,里面200个蓝牙模块要修改MAC地址。人工操作是:打开配置软件,复制第一条MAC,粘贴进输入框,点写入,等结果,再复制第二条……这种活干到第50条的时候,手和眼睛都已经不在状态了。RPA的话,你把流程录一遍,剩下的让它在后台慢慢跑,甚至跑累了还能在日志里告诉你哪几条失败、失败原因是什么。
需要注意,RPA最适合的是"规则明确"的流程。如果你的流程里充满了"看情况""大概判断""也许这样",那RPA帮不了你,它毕竟不是人工智能摆摊。但只要规则清晰、重复度高,哪怕是操作Excel、网页后台、桌面配置软件这种跨系统的活,它都能串成一条自动化流水线。
2.2 主流RPA工具怎么选,影刀凭什么热门
市面上RPA工具不少,圈子里的朋友经常问怎么选。我自己的使用经验是:看你的场景、预算、还有团队技术底子。
影刀RPA近年热度很高,一个重要原因是个人版免费,而且中文生态做得好。它的界面是可视化拖拽指令,同时又支持嵌入Python代码。我在实际使用中感觉,影刀对国产软件、老旧的Windows桌面程序兼容性不错,而且社区教程多,遇到问题随便一搜就有答案。对于工程师个体或小团队,影刀足够用了。
UiPath是老牌的全球化产品,功能非常重,适合大型企业做流程治理,但价格也很"企业"。金智维RPA在金融行业比较多,稳定性好,适合有合规要求的场景。UI.Vision则是轻量方案,主要跑在浏览器里,适合快速做网页自动化,但对桌面软件的掌控力弱很多。
我整理了一个选型对照表,方便你心里有个谱:
| 工具 | 上手难度 | 适合场景 | 成本 |
|---|---|---|---|
| 影刀RPA | 低 | 个人、中小团队、桌面+网页+Excel混合流程 | 个人版免费 |
| UiPath | 中高 | 大企业端到端流程自动化 | 贵 |
| 金智维RPA | 中 | 金融、政务、企业级高合规场景 | 采购制 |
| UI.Vision | 低 | 浏览器网页自动化、轻量流程 | 开源免费版 |
如果你刚入坑,我建议直接用影刀,教程多、试错成本低。后面要上生产环境,再考虑更重的企业级平台也不迟。
2.3 蓝牙开发测试中RPA能落在哪些场景
有人会问,蓝牙是硬件的事,RPA是软件的事,这俩怎么扯上关系?其实关系大得很。BLE产品从开发到量产,中间有大量"软件操作硬件"的重复工作。
最典型的就是批量修改BLE设备MAC地址。厂商配置工具往往是Windows桌面软件,一次只能改一台。你要是负责产测,几十上百台设备摆在那,手工一台台改,不仅效率低,还容易改错。RPA可以从Excel里把预设的MAC列表读出来,一条条填进去,点写入,再校验结果,全程不需要人盯着。
另一个场景是日志收集。BLE调试时经常要抓控制器日志、HCI日志、App日志,抓完还要归纳整理。RPA可以定时打开串口工具、执行抓取命令、把日志文件改名归档,甚至还能在日志里搜索关键字,把包含Disconnect、Timeout的片段摘出来放到汇总表里。这个是我自己用过的场景,真的很省精力。
网页端自动化也一样能套进去。很多人学影刀是为了做电商自动上架,比如"影刀RPA拼多多自动上架教学"里那一套:读取商品表格,打开后台,逐条填写,提交。这套逻辑放到蓝牙后台管理系统上完全成立。所以说白了,RPA不关心你操作的是商品标题还是MAC地址,它只关心你的操作流程是否固定、是否有规则。
3. 实操:用影刀RPA跑一个BLE设备MAC地址批量配置流程
接下来进入正题,我把自己跑过的一个流程拆给你看。场景是这样的:产线有一批BLE设备,需要把Excel里准备好的MAC地址,逐条写入厂商的配置工具,并回写结果。
3.1 流程拆解与前期准备
动手写脚本之前,务必先在纸上把人工流程过一遍。我见过太多人上来就录脚本,结果录完到处是坑。正确的做法是先把流程细化成计算机能执行的步骤。
我这个流程最终拆成这样:
- 打开Excel,读取A列的MAC地址列表。
- 对每条MAC:打开厂商配置工具(桌面软件)。
- 在"MAC地址"输入框填入当前MAC。
- 点击"写入"按钮。
- 等待工具返回"成功"或"失败"。
- 把结果写回Excel的B列。
- 继续下一条,直到列表结束。
前期准备的东西也不多:一台Windows电脑,安装好影刀RPA;厂商配置软件能手动跑通;Excel地址表做好,A列是MAC,B列留空。Mac地址在Excel里一定要把单元格格式设为文本,不然输入D4:36:39:A1:B2:C3这种值,Excel会自作主张搞出科学计数法,等你读到RPA里发现值都变了,那才叫崩溃。
3.2 影刀RPA环境准备与第一个流程框架
影刀RPA的安装不难,官网下载,注册账号,选"个人版"就行。装完之后打开,新建一个流程项目,界面分三大块:左边是指令列表,中间是流程画布,右边是变量和参数管理。RPA组件这个词,在影刀里指的就是这些封装好的指令块,比如"Excel读取""循环列表""点击元素""输入文本"。
我一般是先建一个空流程,然后把整个逻辑分块。不要试图在一个流程里写完所有事,那样调试起来会疯。可以先建一个主流程,里面调用几个子流程:读取Excel、写入设备、记录结果。这样哪一步出问题,点进去改对应的子流程就行。
新手最容易忽略的是变量管理。MAC地址列表、当前行号、成功次数、失败次数,这些都应该在流程开始时声明清楚。影刀支持把Excel读取结果直接存成变量列表,后面循环的时候直接用。
3.3 Excel数据读取与循环控制,自动化的大动脉
在影刀里,Excel操作有专门组件。打开Excel组件填文件路径,读取区域组件填"A2:A101"这样的范围,结果存到一个列表变量里,比如叫mac_list。如果地址表里第一行是标题,就从A2开始读;如果全是数据,从A1开始也行。
读取完之后,用一个"循环列表"组件,把mac_list里的每一项取出来,存成当前循环变量mac。这里面有个小经验:循环体外要定义好"当前行号"这个变量,初始值为2。每处理一个MAC,当前行号加1,这样最后回写B列时才知道写到哪一行。
影刀的循环指令是可视化的,伪代码逻辑大概长这样:
# 伪代码,说明影刀流程的逻辑 mac_list = Excel读取("设备地址表.xlsx", "A2:A101") current_row = 2 for mac in mac_list: # 后续在3.4中操作配置软件 result = write_mac_to_tool(mac) if result == "成功": Excel写入("设备地址表.xlsx", f"B{current_row}", "成功") else: Excel写入("设备地址表.xlsx", f"B{current_row}", "失败") current_row += 1影刀里不用写这些代码,但在脑子里把逻辑捋成这个伪代码,再拖组件就非常快。
3.4 桌面配置软件自动化,考验识别能力的关键一步
填MAC地址这种事,难的不是Excel,而是操作厂商的桌面工具。不同配置软件界面差异巨大,有的用C#写得规规矩矩,元素容易识别;有的是老Qt、易语言,甚至自绘界面,RPA的元素选择器可能根本抓不到。
影刀操作桌面软件主要有两种方式:元素识别和图像识别。优先用元素识别,就是鼠标一点选目标控件,影刀生成一个元素选择器。这种方式最稳,不怕窗口位置变化、缩放变化。操作时点开配置软件,按住Ctrl键,用影刀的"元素选择器"工具去抓"MAC地址输入框"。
如果抓不到,退而求其次用图像识别。把输入框在屏幕上的区域截个小图,影刀靠图像定位。这里有个很关键的技巧:截图范围越小越好,最好只截输入框本身,不要带周边背景,否则屏幕分辨率稍微一变,识别就偏了。点击坐标可能偏几个像素,导致点击到旁边的按钮。
填完MAC后,点击"写入"按钮。同样可以用元素识别或者图像识别。点完写入,软件一般会弹一个结果对话框,或者在某个区域显示"写入成功"。这时候用"获取文本"组件读取那个区域的内容,判断是否包含"成功"两个字。不要用固定的Sleep等待,要用"等待元素出现"或者"等待文本出现",指定超时时间比如10秒。固定Sleep虽然简单,但一旦电脑卡顿、软件响应慢,流程就会乱套。
3.5 异常处理与结果回写,脚本稳不稳就看这里
一个RPA流程能跑通不算本事,能稳定跑完100条才算。异常处理是脚本的保命符。
我的做法是:每一条MAC执行时,先设置一个重试计数器。如果第一次点击写入后没有等到"成功",隔2秒再点一次,最多重试3次。3次都不成功,就在Excel里标记"失败",然后把MAC和时间追加到日志文件里。等全量跑完,你再看失败列表,人工介入处理那几条就行,不用全程盯着。
日志这块别省。影刀有日志组件,但我更习惯直接在流程里写一个文本文件,每处理一条MAC就追加一行,格式是时间|MAC|结果。这样脚本跑完,Excel里有结果,日志文件里也有完整轨迹,出了问题方便回溯。
整个流程跑下来,大致效果是:200条MAC,如果不出意外,20分钟之内能跑完。人工操作的话,一条最快也要半分钟,200条就是一个多小时,中间还不能走神。RPA把时间压缩到四分之一左右,更重要的是它不会累、不会看错行。
3.6 从填MAC到填商品,这套思路能迁移到各种场景
我经常在社区看到"影刀RPA拼多多自动上架教学"这种需求,很多人觉得电商自动化和我们搞硬件的不搭边。实际上一旦你理解了RPA的套路,你会发现流程骨架完全一样:读取数据表格、循环处理、操作界面、回写结果。填MAC地址和填商品标题,区别只在于操作的是哪个软件、点击的是哪个按钮。
你想做网页自动化,也一样。影刀有专门的网页自动化组件,打开浏览器、点击元素、填写表单、提交,比桌面端更稳定,因为网页DOM元素识别准。比如你要批量登录某个蓝牙管理后台,把设备数据录进去,完全可以用RPA。核心还是那几个字:数据从哪来、步骤是什么、结果写哪去。
4. 常见问题排查与深水区避坑
脚本写好了,不等于万事大吉。真到了跑生产环境的时候,坑一个接一个。我把实际踩过的坑整理一下,按这个清单排查,能省不少时间。
4.1 地址隐私保护对自动化测试的冲击
前面说了,手机和很多现代BLE设备默认使用可解析私有地址。这意味着你在扫描端看到的设备地址会变,今天扫是A1:B2:C3:D4:E5:F6,明天可能就变成F7:E8:...。如果你在RPA流程里硬编码了设备地址,脚本第二天就可能跑不通。
我自己遇到过这样的情况:用RPA控制电脑上的蓝牙调试工具,按固定地址去连接开发板,开发板用的是静态随机地址,本来没事。但有一次设备掉电重启,随机地址变了,脚本一直连不上,卡在那里直到超时。后来我把逻辑改成:先扫描设备名称,再根据名称拿到当前地址,再发起连接。这样即使地址变了,也能跟着走。
如果你需要RPA去做长稳测试,强烈建议在脚本入口先做一次"设备发现与地址刷新",不要让地址成为静态配置。
4.2 iOS上的identifier不是蓝牙MAC,别被坑了
"uni-app ble ios 可以根据蓝牙的deviceid建立连接吗"这个问题在网上被问烂了。这里必须说清楚:iOS的CoreBluetooth框架里,每个CBPeripheral对象有一个identifier属性,它是一串UUID,但它不是BLE MAC地址,而是系统给你生成的一个稳定标识。
在iOS上,你正常用CoreBluetooth扫描到的设备,是拿不到MAC地址的。系统出于隐私保护,不把真实蓝牙地址暴露给App。你需要连接设备时,直接用这个identifier去调用retrievePeripherals(withIdentifiers:)或者在你保存的外设列表中建立连接,完全没有问题。但你不能把这个identifier当成MAC地址去写进产测系统,更不能指望它和硬件地址一一对应。
Android的情况也类似。Android 6.0之后,普通App调用BluetoothDevice.getAddress()会得到一个固定的02:00:00:00:00:00,真地址被藏起来了,需要特殊权限才能拿到。做RPA自动化和测试的时候,别跟系统隐私保护对着干,换个思路:用广播名称、广播数据里的自定义服务UUID来识别设备,比死磕MAC地址靠谱得多。
4.3 影刀RPA跑着跑着就停,大多数是这3个原因
我总结了一下,影刀RPA流程中段卡住,最常见的原因不外乎下面几个。
第一个是窗口分辨率变化。脚本跑着跑着,屏幕分辨率或者窗口大小变了(比如远程桌面断开重连),图像识别的坐标全偏了,点击全部落空。解决方法是尽量用元素选择器,如果必须用图像识别,就把目标窗口固定大小,或者用"窗口最大化"组件在流程开始时把窗口调整到统一尺寸。
第二个是配置软件弹出意料之外的对话框。比如写入超时后弹了个"是否重试"的窗,你的脚本还在傻等"成功"文本,结果就卡死了。这种问题要靠"异常分支"处理,定时检查是否有弹窗存在,有就关闭它,再继续主流程。我自己会加一个全局的兜底组件:每一轮循环开始前,先检查是否出现了"错误""重试"字样的弹窗,一旦有就点掉。
第三个是Excel文件被占用。流程开始后Excel文件没关,或者被Syncthing、OneDrive同步锁定,影刀读取或写入会失败。跑生产流程前,把Excel文件放到本地纯英文路径下,别放桌面、别放网盘同步盘,能省很多事。
4.4 BLE Mesh远程配网与RPA的想象空间
另外一个比较前沿的方向是BLE Mesh的Remote Provisioning。普通BLE Mesh配网,需要拿着手机贴近未配网设备,完成设备入网。远程配网则可以通过已经入网的节点,把配网数据包转发给远处未入网的设备,实现"人在屋里坐,设备在隔壁配网"。
这给自动化留了很大的操作空间。如果有一套Mesh Provisioner的桌面工具,支持远程配网,那就完全可以用RPA去做批量配网:从Excel读取设备列表,逐个发起远程配网,等待入网成功,记录结果。这样原本需要工人带着手机到处走的活,能变成一台电脑自动跑。不过这个技术目前还在普及阶段,工具链不一定成熟,但思路是对的——只要流程固定、界面可操作,RPA就能接管。
5. 写在最后:这些经验是拿报错换的
关于BLE蓝牙地址和RPA的组合,我个人几点体会很愿意分享出来。
第一,凡是批量操作,先跑通1条再放开跑全量。这个习惯帮我避免了好几次批量改错地址的灾难。RPA流程搭好后,先在Excel里只留3条测试数据,把全流程跑通,确认结果OK,再换成正式数据。别觉得多此一举,一次批量失败的成本远高于多花这几分钟。
第二,变量和日志别省。脚本跑挂的时候,你唯一能依赖的就是日志。我在流程里会在每个关键节点都写一条日志,处理到哪一条、当前MAC是什么、写入结果是什么,全部记录下来。这样不管脚本是自己跑完还是中途躺尸,你都能知道它死不瞑目的原因。
第三,RPA不是万能的。有些超老旧的软件界面,元素识别抓不到,图像识别也不稳定,硬啃会浪费大量时间。真遇到这种情况,可以看看软件有没有命令行参数或者隐藏的配置文件,比如通过改一个INI文件或批处理参数来替代界面操作,可能比RPA更稳妥。别跟UI死磕,绕过去才是效率。
BLE地址这东西,看着简单,里面全是协议层面的细节;RPA这东西,听着玄乎,本质就是流程自动化。两者结合,最大的价值是让你从"重复劳动"里抽身出来,去做更有创造性的事情。希望这篇文章能帮你少踩几个坑,把时间花在刀刃上。