高考考试网
当前位置: 首页 高考资讯

介绍蓝牙配置过程(小白入门教程小梦老师带你学蓝牙)

时间:2023-08-10 作者: 小编 阅读量: 2 栏目名: 高考资讯

小白入门教程小梦老师带你学蓝牙大家好啊,我是梦程~合宙Cat.1模块1.3主线固件支持双模蓝牙,今天就简单说一下蓝牙应该如何使用本教程以Air820开发板为例,讲解BLE的广播和从机功能我们将从经典蓝牙、Beacon、Broadc。

大家好啊,我是梦程~合宙Cat.1模块1.3主线固件支持双模蓝牙,今天就简单说一下蓝牙应该如何使用。

本教程以Air820开发板为例,讲解BLE的广播和从机功能。

我们将从经典蓝牙、Beacon、Broadcast、Slave四种模式进行具体讲解,在大多数的使用环境下,基本离不开这四种模式。

经典蓝牙示例
1.1 蓝牙功能系统信息

首先了解一下蓝牙功能里面的一些系统消息服务,我们要使用这些服务进行逻辑编排。

1.2 经典蓝牙函数1.3 经典蓝牙示例代码

--- 模块功能:经典蓝牙示例-- @author Darren Cheng-- @module bluetooth.bt-- @license MIT-- @copyright openLuat-- @release 2021.08.24-- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本module(..., package.seeall)require "audio"local vol = 50local musicstatus = 1local keyMap = {{},{},{},{},{},{},{},{},{},{}}keyMap[0] = {}keyMap[255] = {}keyMap[2][0] = "ENTER"keyMap[2][1] = "DOWN"keyMap[1][0] = "UP"keyMap[1][1] = "ESC"keyMap[255][255] = "PWK"local function keyMsg(msg)if keyMap[msg.key_matrix_row][msg.key_matrix_col] == "PWK" and msg.pressed thenbtcore.setavrcpsongs(musicstatus)if musicstatus == 0 thenmusicstatus = 1elseif musicstatus == 1 thenmusicstatus = 0endlog.info("bt", "musicstatus",musicstatus)endif msg.pressed thenif keyMap[msg.key_matrix_row][msg.key_matrix_col] == "ENTER" thenbtcore.setavrcpsongs(3)log.info("bt","下一曲")elseif keyMap[msg.key_matrix_row][msg.key_matrix_col] == "ESC" thenbtcore.setavrcpsongs(2)log.info("bt","上一曲")elseif keyMap[msg.key_matrix_row][msg.key_matrix_col] == "UP" thenvol = vol10if vol > 127 thenvol = 127endbtcore.setavrcpvol(vol)log.info("bt","加音量", vol)elseif keyMap[msg.key_matrix_row][msg.key_matrix_col] == "DOWN" thenvol = vol - 10if vol < 0 thenvol = 0endbtcore.setavrcpvol(vol)log.info("bt","减音量", vol)endendendrtos.on(rtos.MSG_KEYPAD,keyMsg)rtos.init_module(rtos.MOD_KEYPAD,0,0x7F,0x7F)local function init()log.info("bt", "init")rtos.on(rtos.MSG_BLUETOOTH, function(msg)if msg.event == btcore.MSG_OPEN_CNF thensys.publish("BT_OPEN", msg.result) --蓝牙打开成功elseif msg.event == btcore.MSG_BT_HFP_CONNECT_IND thensys.publish("BT_HFP_CONNECT_IND", msg.result) --hfp连接成功elseif msg.event == btcore.MSG_BT_HFP_DISCONNECT_IND thenlog.info("bt", "bt hfp disconnect") --hfp断开连接elseif msg.event == btcore.MSG_BT_HFP_CALLSETUP_OUTGOING thenlog.info("bt", "bt call outgoing") --建立呼出电话elseif msg.event == btcore.MSG_BT_HFP_CALLSETUP_INCOMING thenlog.info("bt", "bt call incoming") --呼叫传入sys.publish("BT_CALLSETUP_INCOMING", msg.result)elseif msg.event == btcore.MSG_BT_HFP_RING_INDICATION thenlog.info("bt", "bt ring indication") --呼叫传入铃声elseif msg.event == btcore.MSG_BT_AVRCP_CONNECT_IND thensys.publish("BT_AVRCP_CONNECT_IND", msg.result) --avrcp连接成功elseif msg.event == btcore.MSG_BT_AVRCP_DISCONNECT_IND thenlog.info("bt", "bt avrcp disconnect") --avrcp断开连接endend)endsys.taskInit(function()sys.wait(5000)-- audio.setChannel(1) -- 可调用此api切换播放通道,默认spkinit()-- 初始化log.info("bt", "poweron")btcore.open(2)--打开经典蓝牙sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功log.info("bt", "设置蓝牙参数")btcore.setname("Cat1BT")-- 设置广播名称btcore.setvisibility(0x11)-- 设置蓝牙可见性log.info("bt", "蓝牙可见性",btcore.getvisibility())local _, result = sys.waitUntil("BT_AVRCP_CONNECT_IND") --等待连接成功if result ~= 0 thenreturnendlog.info("bt", "连接成功")while true dovol = btcore.getavrcpvol()if vol == -1 thenlog.info("bt", "获取音量失败", vol)elseif vol == -2thenlog.info("bt", "设备不支持获取音量", vol)elselog.info("bt", "设备音量", vol)endsys.wait(1000)endend)

代码效果解释:

  • 模块成功开机后会初始化蓝牙并广播名称为“Cat1BT”的蓝牙设备
  • 使用手机连接名为“Cat1BT”的设备
  • 按POWER键控制音乐播放与暂停
  • 按DOWN键减小音量,单位为10
  • 按UPWARD键增大音量,单位为10
  • 按ENTER键切换下一首音乐
  • 按ESC键切换上一首音乐
  • 部分手机可能不支持音量调节和获取

源码下载链接:

https://gitee.com/openLuat/X-MagicBox-820/blob/master/demo/bt-learn/bt.lua

BLE-Beacon示例

Beacon:一种特殊的广播,多用于蓝牙定位环境。

系统信息及函数说明详见:https://doc.openluat.com/article/3495#BLEBeacon_393

2.1 BLE-Beacon示例代码

--- 模块功能:蓝牙功能测试-- @author openLuat-- @module bluetooth.beacon-- @license MIT-- @copyright openLuat-- @release 2020.09.27-- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本module(..., package.seeall)local function init()log.info("bt", "init")rtos.on(rtos.MSG_BLUETOOTH, function(msg)if msg.event == btcore.MSG_OPEN_CNF thensys.publish("BT_OPEN", msg.result) --蓝牙打开成功endend)endsys.taskInit(function()sys.wait(5000)init() -- 初始化log.info("bt", "poweron")btcore.open(0) --打开蓝牙从模式sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功log.info("bt", "设置蓝牙参数")btcore.setadvparam(0x80,0xa0,0,0,0x01,0) --广播参数设置 (最小广播间隔,最大广播间隔,广播类型,广播本地地址类型,广播channel map,广播过滤策略,定向地址类型,定向地址)btcore.setbeacondata("AB8190D5D11E4941ACC442F30510B4AB",10107,50179) --beacon设置(uuid,major,minor)btcore.advertising(1)-- 打开广播end)

源码下载链接:

https://gitee.com/openLuat/X-MagicBox-820/blob/master/demo/bt-learn/beacon.lua

2.2 抓包分析

这是通过抓包获取的Beacon数据包:

----------------------------------------------- -------------------- - - -|Packet sniffer frame header| ------- ------------- ------------------------- ------- ----------------- - - -|channel| Packet nbr. | Time stamp| Length|Packet data ------- ------------- ------------------------- ------- ----------------- - - -| 0x25| 03 00 00 00 | 9D B0 E3 07 00 00 00 00 | 26 00 | 00 24 A2 65 44 C6 C2 C8 02 01 1A 1A FF 4C 00 02 15 AB 81 90 D5 D1 1E 49 41 AC C4 42 F3 05 10 B4 AB 27 7B C4 03 C5------- ------------- ------------------------- ------- ----------------- - - -

这里我们可以获取的信息有:Channel就是为0x25,转换成十进制就是37通道AdvA就是模块的MAC地址AdvData为抓取的信息,这是封装用户数据生成的,在代码中则为UUID的数据,即:AB 81 90 D5 D1 1E 49 41 AC C4 42 F3 05 10 B4 AB


这里没有分析仪也可以使用手机app查看,推荐软件为nRF Connect。

BLE-Broadcast示例

系统信息及函数说明详见:

https://doc.openluat.com/article/3495#BLEBroadcast_582

3.1 BLE广播示例代码

-- 模块功能:BLE广播示例-- @author Darren Cheng-- @module bluetooth.slave-- @license MIT-- @copyright openLuat-- @release 2021.08.24-- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本module(..., package.seeall)local function init()log.info("bt", "init")rtos.on(rtos.MSG_BLUETOOTH, function(msg)if msg.event == btcore.MSG_OPEN_CNF thensys.publish("BT_OPEN", msg.result) --蓝牙打开成功endend)endsys.taskInit(function()sys.wait(5000)init() --初始化log.info("bt", "开蓝牙")btcore.open(0)--打开蓝牙从模式sys.waitUntil("BT_OPEN", 5000)--等待蓝牙打开成功log.info("bt", "设置蓝牙参数")btcore.setname("Cat1BT") -- 设置广播名称------------ 设置蓝牙广播数据(LTV格式) --------------advData = "64617272656e"advType = "08"advLenth = string.format("x",(advData:len()/2) 1)btcore.setadvdata(string.fromHex(advLenth .. advType .. advData))------------ 设置蓝牙响应包数据(LTV格式) --------------rspData = "6368656e67"rspType = "08"rspLenth = string.format("x",(rspData:len()/2) 1)btcore.setscanrspdata(string.fromHex(rspLenth .. rspType .. rspData))btcore.setadvparam(0x80,0xa0,0,0,0x07,0)--广播参数设置 (最小广播间隔,最大广播间隔,广播类型,广播本地地址类型,广播channel map,广播过滤策略,定向地址类型,定向地址)btcore.advertising(1)-- 打开广播end)

源码下载链接:

https://gitee.com/openLuat/X-MagicBox-820/blob/master/demo/bt-learn/broadcast.lua

3.2 现象展示及分析

通过抓取数据包得知:设备会广播设置好的数据64617272656e当主机端发出scan请求时,设备端会回复响应包内容6368656e67注意:蓝牙广播数据和响应包数据务必要符合LTV格式完成所有设置之后,再去调用打开广播的API

BLE-Slave示例

系统信息及函数说明详见:

https://doc.openluat.com/article/3495#BLESlave_810

4.1 BLE-Slave示例代码

-- @module bluetooth.slave-- @license MIT-- @copyright openLuat-- @release 2021.08.24-- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本module(..., package.seeall)local useUserService = true -- 用户自定义服务,true启用,false禁用local function init()log.info("bt", "init")rtos.on(rtos.MSG_BLUETOOTH, function(msg)if msg.event == btcore.MSG_OPEN_CNF thensys.publish("BT_OPEN", msg.result) --蓝牙打开成功elseif msg.event == btcore.MSG_BLE_CONNECT_IND thensys.publish("BT_CONNECT_IND", {["handle"] = msg.handle, ["result"] = msg.result}) --蓝牙连接成功elseif msg.event == btcore.MSG_BLE_DISCONNECT_IND thenlog.info("bt", "ble disconnect") --蓝牙断开连接elseif msg.event == btcore.MSG_BLE_DATA_IND thensys.publish("BT_DATA_IND", {["result"] = msg.result})--接收到的数据内容endend)endsys.taskInit(function()sys.wait(5000)init() --初始化log.info("bt", "poweron")btcore.open(0) --打开蓝牙从模式sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功log.info("bt", "设置蓝牙参数")btcore.setname("Cat1BT")-- 设置广播名称btcore.setadvparam(0x80,0xa0,0,0,0x07,0) --广播参数设置 (最小广播间隔,最大广播间隔,广播类型,广播本地地址类型,广播channel map,广播过滤策略,定向地址类型,定向地址)if useUserService thenlog.info("bt", "useUserService")btcore.addservice(0xff88)-- 添加服务uuidbtcore.addcharacteristic(0xffe1,0x08,0x002)--添加特征 可写-- btcore.addcharacteristic(0xffe1,0x08 0x04,0x002)--添加特征 可写 特征属性可以写多个,用 连接btcore.addcharacteristic(0xffe2,0x10,0x001)--添加特征 通知btcore.adddescriptor(0x2902,0x0001)--添加描述btcore.addcharacteristic(0xffe3,0x02,0x001)--添加特征 可读endbtcore.advertising(1)-- 打开广播_, bt_connect = sys.waitUntil("BT_CONNECT_IND")if bt_connect.result ~= 0 thenreturn falseend--链接成功log.info("bt","connect_handle",bt_connect.handle) -- 连接句柄while true do_, bt_recv = sys.waitUntil("BT_DATA_IND") -- 等待接收到数据local data = ""local len = 0local uuid = ""while true dolocal recvuuid, recvdata, recvlen = btcore.recv(3)if recvlen == 0 thenbreakenduuid = recvuuidlen = lenrecvlendata = data .. recvdataendif len ~= 0 thenlog.info("bt","recv_data:", data)log.info("bt","recv_data_len", len)log.info("bt","recv_uuid:", string.toHex(uuid))if data == "close" thenbtcore.disconnect()--主动断开连接endif useUserService thenbtcore.send(data, 0xffe2, bt_connect.handle)-- 发送数据(数据 对应特征uuid 连接句柄)endbtcore.send(data, 0xfee2, bt_connect.handle)-- 发送数据(数据 对应特征uuid 连接句柄)endendend)

源码下载链接:

https://gitee.com/openLuat/X-MagicBox-820/blob/master/demo/bt-learn/slave2.lua

4.2 代码效果展示:

用户需根据需求设置useUserService,true为启用用户添加服务,false为禁用用户添加服务,使用默认服务。

1)用户不添加服务的情况下,会提供几个默认服务,若用户自行添加服务,则默认服务会被删除。

2)用户添加自定义服务

用户可使用0xFFE1的UUID向模块发送数据,发送的数据会回显到0xFFE2,用户可通过订阅0xFFE2获取数据。

注意:

  • 添加服务时不要与已有服务的UUID重复
  • 添加特征时,特征属性和特征权限要按照规定的格式
  • 特征属性和权限可使用多个,使用 连接
  • 用户完成所有添加操作之后,再去调用打开广播API

今天的内容就分享到这里了,建议大家阅读本文的API相关知识,已经根据官方文档做了部分翻译和注释,也提到了一些注意点。根据我编写的一些小demo去学习和实践,甚至可以说,改一改demo就是你自己的作品,期待大家可以使用蓝牙去做一些更有意思的项目。

- 相关开发资料链接 -

Air820UG开发板资料

https://gitee.com/openLuat/X-MagicBox-820/

LuatOS-Air开发资料

https://gitee.com/openLuat/Luat_Lua_Air724U

LuatOS-SoC仓库

https://gitee.com/openLuat/LuatOS

LuatOS开发指南/入门教程

https://doc.openluat.com/wiki/3?wiki_page_id=606

上海合宙通信模块 - 合宙Luat,让万物互联更简单

    推荐阅读
  • 我们没有时间犹豫幻想罗曼蒂克的爱情是什么歌(愚人游戏完整歌词)

    我们没有时间犹豫幻想罗曼蒂克的爱情,出自歌曲:《愚人游戏》,现在小编就来说说关于我们没有时间犹豫幻想罗曼蒂克的爱情是什么歌?下面内容希望能帮助到你,我们来一起看看吧!

  • 表扬信格式范文(表扬信的标准格式究竟是什么样的)

    人上了年纪的好处,就是自己已无需再记述,岁月替我们书写了充满沟壑的故事。我一直认为,人存在的意义,就是要思考那些宇宙终极问题。长久以来,这个问题都在深深地困扰着我,直到今天。不简练也就算了,为什么还要在正式信函中用“屌丝”、“灰常”、“艾玛”这种网络用语呢?下面这个可能是最接近标准格式的表扬信了,但也是最恶劣的!尽管他们有这样那样的问题,但这种精神值得鼓励。但还是没有找到那封最完美的表扬信。

  • 产权比率是什么(产权比率的介绍)

    跟着小编一起来看一看吧!产权比率是什么产权比率是负债总额与所有者权益总额的比率。产权比率是评估资金结构合理性的一种指标,可反映股东所持股权是否过多等情况,从另一个方面表明企业借款经营的程度。这一比率是衡量企业长期偿债能力的指标之一。产权比率越低表明企业自有资本占总资产的比重越大,长期偿债能力越强。

  • 鱼胶原蛋白肽的功效与作用(鱼胶原蛋白肽的功效与作用是什么)

    鱼胶原蛋白肽粉本身属于一种蛋白质这种蛋白肽粉摄入体内可以增强人体的免疫力,可以抑制脂肪的合成、加速脂肪的分解,能够起到辅助减肥的作用,我来为大家讲解一下关于鱼胶原蛋白肽的功效与作用?鱼胶原蛋白肽的功效与作用鱼胶原蛋白肽粉本身属于一种蛋白质。但是需要注意,本身有过敏性疾病的人群不建议吃这种鱼胶原蛋白肽粉,不然可能会引发过敏现象。

  • 关于花的唯美句子(40句关于花的精美句子)

    彼岸花开一千年落一千年花与风之间有着自己的约定。一朵彼岸花,为你盛开于浮华,是否能为你盛开这美丽的浮华。此花一名曼珠沙华,红色花又名彼岸花,也称为RedSpiderLily。也许,只有渡过迷茫的河流,才知道彼岸花开的灿烂。自己的独白,静候彼岸花的盛开。彼岸花,恶魔的温柔。我和她已成为陌路,成了天边的彼岸花。彼岸花,美丽而忧伤。爱一个人不需要任何理由,一直等到彼岸花开。以往情人般的依人,此时过路般的伤人

  • 英国女王纪录片全集(英国女王见证电影从默片到4K)

    英国女王见证电影从默片到4K封面新闻记者闫雯雯英国伊丽莎白二世的一生,实际上也是伴随着世界电影历史发展的一生,更是见证了电影从默片到4K发展的一生1927年,世界上第一部有声电影《爵士歌王》上映,那时伊丽莎白刚刚出生一年多的时间。

  • 酥皮仙豆糕的做法(酥皮仙豆糕的怎么做)

    酥皮仙豆糕的做法外皮:鸡蛋1个、细砂糖25克、玉米油15克、牛奶10克、玉米淀粉25克、低筋面粉75克。蒸好的紫薯取出,不烫手再进行操作,在紫薯中加入15克牛奶,可以用料理机打成泥,没有硬块即可,由于紫薯含水量不同,牛奶要少量多次酌情加入,紫薯泥到不干的状态就可以了。马苏里拉芝士要提起软化好,取紫薯泥15克左右,包入5克左右马苏里拉芝士,总重量不超过22克,经验证,馅料再多就不容易包了。

  • 瓷砖美缝有几种方法(瓷砖美缝的施工方法及流程)

    大体看一下没有问题就给业主打电话要求结尾款,业主检查后发现问题、指出问题然后美缝师修复问题。而卓高美缝直接将效果复查作为一道工序去严格执行,逐条检查,是否有未清余料的,是否有漏打料的,是否有带黑边的等等。交工前先保洁,是卓高美缝特有的增值服务,也是美缝师的职业涵养和服务态度,是美缝师非常获赞的一点。

  • 剑雨哪年拍的(全片无任何侠义字眼)

    呼喊有利证人,站在有利面。虽挂名吴宇森,但实打实是苏照彬自编自导的作品,他还凭借这部影片获得了第十七届香港电影评论学会大奖最佳导演奖,可惜生不逢时。所以与它同档的《狄仁杰之通天帝国》虽口碑同样不佳,但票房却已近3亿绝对碾压。无奈战术轮最终不敌,被雷彬刺入左胸,父亲身死,罗摩遗体也被细雨趁乱摸走。杀手话不多,一剑又刺入张人凤左胸完成补刀,不用猜,张仁凤最终跌落石桥,生死不明。

  • 柏树移栽绝招(柏树移栽绝招有哪些)

    浇生根剂柏树的生长速度慢,移栽后建议尽快浇灌生根剂促使尽快发根,否则长时间养分供应不上容易死亡。市面上有针对针叶类树木的发根剂,按照说明使用就行。加强养护想要移栽的柏树成活率更高,还要注意后期的养护管理。但是湿度一定要控制好,土壤微湿就行,不能有积水情况,否则容易烂根。在没有适应新的环境之前,先不要着急追肥,保证温度适宜,水分适量即可。