凌思微-LE5010蓝牙开发(五)
LE5010-凌思微电子蓝牙芯片的开发记录(五)
这篇文章主要介绍凌思微电子蓝牙模块的代码上怎么设置加密模式。
首先代码附上:(注意此例程是基于ble_hid这个demo进行修改的)
/**defgroup SEC Parameter**/
#define OOB_DATA_FLAG 0x0 /**< Indicate whether OOB is supported. */
#define AUTHREQ (AUTH_MITM | AUTH_BOND) /**< Set the auth. */
#define KEY_SIZE 0x10 /**< Indicate the supported maximum LTK size (range: 7-16). */
#define INIT_KEY_DIST (KDIST_ENCKEY | KDIST_IDKEY) /**< Set the initial key distribution. */
#define RESP_KEY_DIST (KDIST_ENCKEY | KDIST_IDKEY) /**< Set the response key distribution. */
#define passkey_number {'1','2','3','4','5','6'} /**< Set the passkey,size(6). */#include "ls_ble.h"
//set the default security parameters.
struct pair_feature feat_param =
{.iocap = BLE_GAP_IO_CAPS_DISPLAY_ONLY,.oob = OOB_DATA_FLAG,.auth = AUTHREQ,.key_size = KEY_SIZE,.ikey_dist = INIT_KEY_DIST,.rkey_dist = RESP_KEY_DIST
};struct gap_pin_str passkey =
{.pin = passkey_number,.str_pad = 0
};
static const struct svc_decl dis_server_svc =
{.uuid = dis_svc_uuid,.att = (struct att_decl*)dis_server_att_decl,.nb_att = DIS_SVC_ATT_NUM,.uuid_len = UUID_LEN_16BIT,.sec_lvl = 1,
};
static void gap_manager_callback(enum gap_evt_type type, union gap_evt_u *evt, uint8_t con_idx)
{...switch (type){ ...case MASTER_PAIR_REQ:{gap_manager_slave_pair_response_send(con_idx, true, &feat_param);gap_manager_passkey_input(con_idx,&passkey);}break;...}
...
}
上面的代码都是需要的,简单解释下:这个是作为从机的一个hid设备,我们在这个从设备的dis这个服务上设置一个安全级别(.sec_lvl = 1,),只有主设备在发现这个服务的时候便会发现自己的安全级别不够就会触发主设备发起配对加密这个流程,这个时候从机就会上一个MASTER_PAIR_REQ事件,这个时候我们就将发送自己的配对参数以及配对的密钥,这样只要主机输入的密钥正确就可以连接上这个设备了,但是需要注意的是,如果密钥输入错误就需要从机这边做一个断连处理,密钥错误后从机就会上一个ENCRYPT_FAIL事件,这个时候我们就可以使用断连的接口对设备进行断连,断连原因可以设置为HCI_AUTHENTICATION_FAILURE(0x05)。
如果想对蓝牙配对绑定想多一些了解建议查看这篇博客,看完这篇博客后基本上就对蓝牙绑定的流程全了解了:https://www.cnblogs.com/iini/p/12801242.html
/**蓝牙-HCI错误码列表**/1 /* Success code */2 #define HCI_SUCCESS 0x003 /* Possible error codes */4 #define HCI_UNKNOWN_HCI_COMMAND 0x015 #define HCI_NO_CONNECTION 0x026 #define HCI_HW_FAILURE 0x037 #define HCI_PAGE_TIMEOUT 0x048 #define HCI_AUTHENTICATION_FAILURE 0x059 #define HCI_KEY_MISSING 0x06
10 #define HCI_MEMORY_FULL 0x07
11 #define HCI_CONN_TIMEOUT 0x08
12 #define HCI_MAX_NUMBER_OF_CONNECTIONS 0x09
13 #define HCI_MAX_NUMBER_OF_SCO_CONNECTIONS_TO_DEVICE 0x0A
14 #define HCI_ACL_CONNECTION_EXISTS 0x0B
15 #define HCI_COMMAND_DISSALLOWED 0x0C
16 #define HCI_HOST_REJECTED_DUE_TO_LIMITED_RESOURCES 0x0D
17 #define HCI_HOST_REJECTED_DUE_TO_SECURITY_REASONS 0x0E
18 #define HCI_HOST_REJECTED_DUE_TO_REMOTE_DEVICE_ONLY_PERSONAL_SERVICE 0x0F
19 #define HCI_HOST_TIMEOUT 0x10
20 #define HCI_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE 0x11
21 #define HCI_INVALID_HCI_COMMAND_PARAMETERS 0x12
22 #define HCI_OTHER_END_TERMINATED_CONN_USER_ENDED 0x13
23 #define HCI_OTHER_END_TERMINATED_CONN_LOW_RESOURCES 0x14
24 #define HCI_OTHER_END_TERMINATED_CONN_ABOUT_TO_POWER_OFF 0x15
25 #define HCI_CONN_TERMINATED_BY_LOCAL_HOST 0x16
26 #define HCI_REPETED_ATTEMPTS 0x17
27 #define HCI_PAIRING_NOT_ALLOWED 0x18
28 #define HCI_UNKNOWN_LMP_PDU 0x19
29 #define HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A
30 #define HCI_SCO_OFFSET_REJECTED 0x1B
31 #define HCI_SCO_INTERVAL_REJECTED 0x1C
32 #define HCI_SCO_AIR_MODE_REJECTED 0x1D
33 #define HCI_INVALID_LMP_PARAMETERS 0x1E
34 #define HCI_UNSPECIFIED_ERROR 0x1F
35 #define HCI_UNSUPPORTED_LMP_PARAMETER_VALUE 0x20
36 #define HCI_ROLE_CHANGE_NOT_ALLOWED 0x21
37 #define HCI_LMP_RESPONSE_TIMEOUT 0x22
38 #define HCI_LMP_ERROR_TRANSACTION_COLLISION 0x23
39 #define HCI_LMP_PDU_NOT_ALLOWED 0x24
40 #define HCI_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25
41 #define HCI_UNIT_KEY_USED 0x26
42 #define HCI_QOS_NOT_SUPPORTED 0x27
43 #define HCI_INSTANT_PASSED 0x28
44 #define HCI_PAIRING_UNIT_KEY_NOT_SUPPORTED 0x29
代码摘自:lwBT Bluetooth stack
以上代码取自:https://www.cnblogs.com/utank/p/5095692.html
/********************************************** 分界线 **********************************************/
上面的都是主机主动发起配对请求的,下面的介绍下从机主动发起配对请求的这个命令。
话不多说直接上代码:
一些参数配置和上面是一样的。我这边就直接复制。
#define OOB_DATA_FLAG 0x0 /**< Indicate whether OOB is supported. */
#define AUTHREQ (AUTH_MITM | AUTH_BOND) /**< Set the auth. */
#define KEY_SIZE 0x10 /**< Indicate the supported maximum LTK size (range: 7-16). */
#define INIT_KEY_DIST (KDIST_ENCKEY | KDIST_IDKEY) /**< Set the initial key distribution. */
#define RESP_KEY_DIST (KDIST_ENCKEY | KDIST_IDKEY) /**< Set the response key distribution. */
#define passkey_number {'1','2','3','4','5','6'} /**< Set the passkey,size(6). */#include "ls_ble.h"
//set the default security parameters.
struct pair_feature feat_param =
{.iocap = BLE_GAP_IO_CAPS_DISPLAY_ONLY,.oob = OOB_DATA_FLAG,.auth = AUTHREQ,.key_size = KEY_SIZE,.ikey_dist = INIT_KEY_DIST,.rkey_dist = RESP_KEY_DIST
};struct gap_pin_str passkey =
{.pin = passkey_number,.str_pad = 0
};static void gap_manager_callback(enum gap_evt_type type, union gap_evt_u *evt, uint8_t con_idx)
{...switch (type){ ...case CONNECTED:{...if(evt->connected.peer_id == 0xff){gap_manager_slave_security_req(con_idx, true, AUTHREQ);}...}case MASTER_PAIR_REQ:{gap_manager_slave_pair_response_send(con_idx, true, &feat_param);gap_manager_passkey_input(con_idx,&passkey);}break;...}
...
}
这里面有一个语句需要解释下:
if(evt->connected.peer_id == 0xff){gap_manager_slave_security_req(con_idx, true, AUTHREQ);}
这个位置的判断其实是为了配对成功后不再发起这个配对请求,这个peer_id是只有配对完成后才会改变,并且不同的连接设备都会分配一个peer_id,如果一个新的设备连接后,这个peer_id为0xff,否者不为0xff.
/********************************************** 分界线 **********************************************/
有些客户需要不输入密码的配对,手机直接出现一个配对按钮,点击配对便可进行连接,这种的只需要修改下.iocap便可,
直接上代码:
/**defgroup SEC Parameter**/
#define OOB_DATA_FLAG 0x0 /**< Indicate whether OOB is supported. */
#define AUTHREQ (AUTH_MITM | AUTH_BOND) /**< Set the auth. */
#define KEY_SIZE 0x10 /**< Indicate the supported maximum LTK size (range: 7-16). */
#define INIT_KEY_DIST (KDIST_ENCKEY | KDIST_IDKEY) /**< Set the initial key distribution. */
#define RESP_KEY_DIST (KDIST_ENCKEY | KDIST_IDKEY) /**< Set the response key distribution. */#include "ls_ble.h"
//set the default security parameters.
struct pair_feature feat_param =
{.iocap = BLE_GAP_IO_CAPS_NONE,.oob = OOB_DATA_FLAG,.auth = AUTHREQ,.key_size = KEY_SIZE,.ikey_dist = INIT_KEY_DIST,.rkey_dist = RESP_KEY_DIST
};
static const struct svc_decl dis_server_svc =
{.uuid = dis_svc_uuid,.att = (struct att_decl*)dis_server_att_decl,.nb_att = DIS_SVC_ATT_NUM,.uuid_len = UUID_LEN_16BIT,.sec_lvl = 1,
};
static void gap_manager_callback(enum gap_evt_type type, union gap_evt_u *evt, uint8_t con_idx)
{...switch (type){ ...case MASTER_PAIR_REQ:{gap_manager_slave_pair_response_send(con_idx, true, &feat_param);}break;...}
...
}
或:
#define OOB_DATA_FLAG 0x0 /**< Indicate whether OOB is supported. */
#define AUTHREQ (AUTH_MITM | AUTH_BOND) /**< Set the auth. */
#define KEY_SIZE 0x10 /**< Indicate the supported maximum LTK size (range: 7-16). */
#define INIT_KEY_DIST (KDIST_ENCKEY | KDIST_IDKEY) /**< Set the initial key distribution. */
#define RESP_KEY_DIST (KDIST_ENCKEY | KDIST_IDKEY) /**< Set the response key distribution. */#include "ls_ble.h"
//set the default security parameters.
struct pair_feature feat_param =
{.iocap = BLE_GAP_IO_CAPS_NONE,.oob = OOB_DATA_FLAG,.auth = AUTHREQ,.key_size = KEY_SIZE,.ikey_dist = INIT_KEY_DIST,.rkey_dist = RESP_KEY_DIST
};static void gap_manager_callback(enum gap_evt_type type, union gap_evt_u *evt, uint8_t con_idx)
{...switch (type){ ...case CONNECTED:{...if(evt->connected.peer_id == 0xff){gap_manager_slave_security_req(con_idx, true, AUTHREQ);}...}case MASTER_PAIR_REQ:{gap_manager_slave_pair_response_send(con_idx, true, &feat_param);}break;...}
...
}
好了这里将le5010的加密配对的一些代码配置全部讲解完了,收工。
凌思微-LE5010蓝牙开发(五)相关推荐
- 凌思微-LE5010蓝牙开发(一)
LE5010-凌思微电子蓝牙芯片的开发记录(一) Linkedsemi(凌思微电子有限公司) 内容简介 环境安装 步骤一:![keil开发注意事项](https://img-blog.csdnimg. ...
- 凌思微-LE5010蓝牙开发(三)
LE5010-凌思微电子蓝牙芯片的开发记录(三) 第1章 OTA镜像处理流程 1. 1 Flash的分区使用情况: 1. 2 Bootloader 启动流程(OTA相关) 1. 3 OTA和Flash ...
- LE5010蓝牙芯片(凌思微)开发总结
一.问题描述:项目中有一个温度传感器NST1001是通过计数脉冲来获取温度原始值的,每个 周期50ms,脉冲周期最大35ms,空闲时间15ms,脉冲脚配置为外部中,因为频繁进入外部中断,导致和蓝牙广播 ...
- [Telink泰凌微825x]硬件开发环境搭建(一)
使用安信可TB04模块搭建泰凌微官方SDK开发环境 文章目录 目录 前言 一.模块的选择 二.原理图说明 1.原理图 2.原理图说明 3.GERBER文件下载 总结 前言 最近需要用到蓝牙mesh组网 ...
- 开发指南专题五:JEECG微云快速开发平台代码生成器
开发指南专题五:JEECG微云快速开发平台代码生成器 1.1. Maven开发环境搭建 在搭建jeecg的maven开发环境之前,需要先配置好本机的maven环境,并在eclipse中安装好m2ecl ...
- 开发指南专题十五 JEECG微云快速开发平台EXCEL导入导出
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 开 ...
- Aooms_基于SpringCloud的微服务基础开发平台实战_002_工程构建
为什么80%的码农都做不了架构师?>>> 一.关于框架更名的一点说明 最近在做年终总结.明年规划.还有几个项目需要了结.出解决方案,事情还比较多,死了不少脑细胞,距离上一篇文章 ...
- 【Funpack】Thunderboard BG22 蓝牙开发板
硬件平台 Thunderboard BG22 是一款来自 Silicon Labs(芯科科技)的蓝牙开发套件.Silicon Labs 公司一直提供丰富的业内先进的无线连接产品,BG22 是 2020 ...
- android蓝牙聊天设备,Android蓝牙开发——实现蓝牙聊天
最近课上刚好需要做一个课程设计关于蓝牙的就挑选了个蓝牙聊天室,其实关键还是在于对蓝牙API的了解 一.蓝牙API 与蓝牙开发主要的相关类是以下四个 BluetoothAdapter 字面上则理解为蓝牙 ...
最新文章
- java web中炸包,Javaweb出来炸到---HTML
- c++枚举类型(二) c++11 枚举类
- 解析css之position
- 移植dropbear 实现ssh远程登录功能
- 如何将Eclipse 的JavaWeb工程部署到Tomcat的webapps目录下
- hdu 4715 Difference Between Primes 2013年ICPC热身赛A题 素数水题
- 王者为什么有些服务器在维护,王者荣耀服务器正在维护中怎么回事 进不去怎么办...
- 【李宏毅机器学习】01:机器学习介绍 Introduction
- 信息发布系统 Jquery+MVC架构开发(5) DAL层
- Win7开机动画不见了
- java jvm理解_深入理解JVM(一)——基本原理
- sql建表语句(含:序列、主键)
- 遥控三通直升机飞行原理简介
- 深度学习—神经网络和卷积神经网络简单介绍
- 一些文字游戏....
- 简单的java华氏转摄氏温度
- 【图形学】计算机图形学的应用领域
- 永久删除的文件还能找回来吗 永久删除的文件如何恢复
- SAP第四代增强 BTE
- 从代码层面分析STM32 标准库和HAL库的差异
热门文章
- Microsoft Teams Voice语音落地系列-4-外传2-界面配置语音路由
- RomUtil【Android判断手机ROM,用于判断手机机型】
- python3爬虫记(一)------------------利用 requests 和 lxml 爬取小说
- 基于讯飞AI接口的物体识别 详细教程
- 关于秘密共享方案的实例(shamir)
- Android记账本案例
- 数据采样 22382份,如何才能学好Python并找到工作
- 最短路径之迪杰斯特拉(Dijkstra)算法
- linux 下oracle备份脚本,linux 下的 oracle 自动备份脚本
- 算法设计与分析实验---动态规划