CH58x/CH59x不同类型广播使用

news/2025/4/2 9:07:08/文章来源:https://www.cnblogs.com/frontier/p/18802412

前言:

  在日常使用的时候我们用到的广播基本就是普通从机广播,在有特殊使用场景的时候我们可能会用到定向广播和拓展广播。本次对使用对定向广播和拓展广播。

一:定向广播

定向广播类型是为了尽可能快的连接,俗称回连包,这种报文包含两个地址:广播者的地址和发起者的地址。发起者收到发给自己的定向广播报文之后,可以立即发送连接请求作为回应。
定向广播类型有特殊的时序要求。完整的广播时间必须每3.75ms重复一次。这一要求使得扫描设备只需扫描3.75ms便可以收到定向广播设备的消息。
当然,如此快的发送会让报文充斥着广播信道,进而导致该区域内的其他设备无法进行广播。因此,定向广播不可以持续1.28s以上的时间。如果主机没有主动要求停止,或者连接没有建立,控制器都会自动停止广播。一旦到了1.28s,主机便只能使用间隔长得多的可连接非定向广播让其他设备来连接。
当使用定向广播时,设备不能被主动扫描。此外,定向广播报文的净荷中也不能带有其他附加数据。该净荷只能包含两个必须的地址。原文链接:https://blog.csdn.net/qq_24179601/article/details/105558307

attention:

使用定向广播时只有主机PeerAddrDef中存有从机的mac地址的主机才可以扫描到,其他主机设备是无法搜索的。

定向广播报文的净荷中不能带有其他附件数据。该净荷中只能包含两个必需的地址。

代码实现:

void directAdvertising(void)
{gapBondRec_t bond_info;uint8_t adv_event_type = GAP_ADTYPE_ADV_HDC_DIRECT_IND;uint8_t Adv_Direct_Addr[B_ADDR_LEN];uint8_t Adv_Direct_Type = adv_direct.advtype;  //建立连接时可以获取到地址类型,传入即可if(Adv_Direct_Type == 3)    //identity address,可能为public address,也可能是random static address,因此传入地址0或者1
    {uint8_t enable = ENABLE;GAPBondMgr_SetParameter( GAPBOND_AUTO_SYNC_RL, sizeof(uint8), &enable);  //解析之后地址类型只有0或者1Adv_Direct_Type = 0;}tmos_snv_read(mainRecordNvID(0), sizeof(gapBondRec_t), &bond_info);  /*获取主机MAC地址并打印*/tmos_memcpy(Adv_Direct_Addr, bond_info.publicAddr, 6);PRINT("Adv Direct type:%#x (", Adv_Direct_Type);for (int i = 0; i < 6; i++) {PRINT("%#x ", Adv_Direct_Addr[i]);} PRINT(")\n");GAPRole_SetParameter( GAPROLE_ADV_DIRECT_ADDR, sizeof(Adv_Direct_Addr), Adv_Direct_Addr);GAPRole_SetParameter( GAPROLE_ADV_DIRECT_TYPE, sizeof(Adv_Direct_Type), &Adv_Direct_Type);GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof(adv_event_type), &adv_event_type);uint8_t initial_advertising_enable = TRUE;// Set the GAP Role ParametersGAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8), &initial_advertising_enable);
}

主机扫描到对应的直连广播的分支里:

        case GAP_DIRECT_DEVICE_INFO_EVENT:{// Display device addrPRINT("Recv direct adv \n");// Add device to listcentralAddDeviceInfo(pEvent->deviceDirectInfo.addr, pEvent->deviceDirectInfo.addrType);}break;

 二:拓展广播

 蓝牙5.0把广播信道抽象为两类,一种叫主广播信道(primary advertisement channels),工作在37,38,39三个信道中,蓝牙4.0的广播使用的都是主广播信道,另一种叫第二广播信道(Secondary Advertising Packets),工作在0–36信道中,这是蓝牙5.0新增的。

 拓展广播结构如下图所示:

 

代码实现:

static uint8_t advertData_ext[] = {0x12, // length of this data
        GAP_ADTYPE_LOCAL_NAME_COMPLETE,'A','B','C','D','E','F',' ','P','e','r','i','p','h','e','r','a','l',0x40,GAP_ADTYPE_MANUFACTURER_SPECIFIC,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03
};static uint8_t scanrspData_ext[] = {0x12, // length of this data
        GAP_ADTYPE_LOCAL_NAME_COMPLETE,'A','B','C','D','E','F',' ','P','e','r','i','p','h','e','r','a','l',0x40,GAP_ADTYPE_MANUFACTURER_SPECIFIC,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09,0x00,0x07,0x08,0x09
};void Peripheral_Init(){{   //扩展广播...
        uint8 adv_type;adv_type = GAP_ADTYPE_EXT_CONN_UNDIRECT; //可选择非定向的其他类型,这里为举例if(adv_type == GAP_ADTYPE_EXT_SCAN_UNDIRECT){printf("scan\n");GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &adv_type);GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof( scanrspData_ext ), scanrspData_ext ); //非定向扫描扩展需使用扫描数据
        }else if(adv_type == GAP_ADTYPE_EXT_NONCONN_NONSCAN_UNDIRECT){printf("no con no scan\n");GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &adv_type);GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof( advertData_ext ), advertData_ext ); //非定向不可扫描不可连接扩展使用广播数据
        }else if(adv_type == GAP_ADTYPE_EXT_CONN_UNDIRECT){printf("con\n");GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &adv_type);GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof( advertData_ext ), advertData_ext ); //非定向可连接扩展需使用广播数据
        }}
}

主机扫描到对应的设备在这个分支:

      case GAP_EXT_ADV_DEVICE_INFO_EVENT:{// Display device addrPRINT("Recv ext adv \n");// Add device to listcentralAddDeviceInfo(pEvent->deviceExtAdvInfo.addr, pEvent->deviceExtAdvInfo.addrType);}break;

注意扫描的主机设备同样需要支持BLE5.0及以上。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908740.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k 近邻算法

什么是 k 近邻? k 近邻(K-NearestNeighbor,简称 KNN)算法应该是机器学习中最简单的一个算法了,不过它虽然简单,但也有很多优点,比如:思想极度简单; 使用的数学知识很少(近乎为 0) 对于一些特定的数据集有非常好的效果; 可以解释机器学习算法使用过程中的很多细节问…

个性化配色方案

配置配色方案在app主页点击存储选择内部在根目录下找到 config 目录, 如果没有的话就创建进入 config 目录, 找到 ColorScheme 目录, 如果没有就创建进入 ColorScheme 目录, 可以创建 light.json 和 dark.json 两个文件, 一个用于在亮色模式下显示的配色方案, 一个用于暗色模式…

编辑器插件

开发编辑器插件步骤如下:在 build.gradle.kts 文件中添加 m8test sdk 依赖 , 为了减小插件apk大小, 如果是 M8Test Version Catalog 中存在的依赖库请使用 compileOnly 来依赖项目import com.m8test.util.VersionUtilsplugins {alias(m8test.plugins.android.application)alias…

基于分数Talbot效应的阵列光学涡旋产生matlab模拟与仿真

1.程序功能描述 基于分数Talbot效应的阵列光学涡旋产生matlab模拟与仿真,分别测试正方形,旋转正方形以及六边形三种阵列形状下的光学涡旋。 2.测试软件版本以及运行结果展示MATLAB2013b版本运行 测试正方形: 测试旋转正方形: 测试六边形: (完整程序运行后无水印…

组件插件

开发组件插件步骤如下:在 build.gradle.kts 文件中添加 m8test sdk 依赖 , 为了减小插件apk大小, 如果是 M8Test Version Catalog 中存在的依赖库请使用 compileOnly 来依赖项目import com.m8test.util.VersionUtilsplugins {alias(m8test.plugins.android.application)alias(m…

python-cv2读取图片位置+设置图片上文字的位置、字体、颜色等参数

import cv2 # cv2读取图片位置,图片位置必须存在桌面,与cv2的路径一样,并且图片格式和名称必须一致img = cv2.imread(face1.jpg) # POS-10-50指字的上下左右位置, font指字体,color的255指字颜色绿色pos= (10,50) font = cv2.FONT_HERSHEY_SIMPLEX color = (255,255,0) #设…

语言插件

开发语言插件步骤如下:在 build.gradle.kts 文件中添加 m8test sdk 依赖 , 为了减小插件apk大小, 如果是 M8Test Version Catalog 中存在的依赖库请使用 compileOnly 来依赖项目import com.m8test.util.VersionUtilsplugins {alias(m8test.plugins.android.application)alias(m…

通用插件

开发通用插件步骤如下:在 build.gradle.kts 文件中添加 m8test sdk 依赖 , 为了减小插件apk大小, 如果是 M8Test Version Catalog 中存在的依赖库请使用 compileOnly 来依赖项目import com.m8test.util.VersionUtilsplugins {alias(m8test.plugins.android.application)alias(m…

阿里云服务器的网站被提示该内容禁止访问的解决办法

当阿里云提示“该内容禁止访问”时,通常是因为网站被检测到存在违法或不良信息,导致URL被屏蔽。以下是解决该问题的详细步骤和防护建议:一、问题描述现象:网站无法访问,提示“该内容禁止访问”。 阿里云发送短信或邮件通知,明确违规URL和具体违规内容。原因:网站存在漏洞…

通义灵码 Rules 来了:个性化代码生成,对抗模型幻觉

通义灵码又上新外挂啦,Project Rules来了。当模型生成代码不精准,试下通义灵码 Rules,对抗模型幻觉,硬控 AI 根据你的代码风格和偏好生成代码和回复。分享你的Rules规则,赢取通义灵码头号玩家活动奖品, 立即参与 通义灵码又上新外挂啦,Project Rules来了。当模型生成代码…