NXP QN9020
NXP的这个BLE蓝牙方案也很有趣, 一起研究.
这个函数在app_gpa_task.c里面
****************************************************************************************
* @brief Handles create connection request complete event from the GAP. *//** 处理GAP连接结束后的事件.
*
* @param[in] msgid GAP_LE_CREATE_CONN_REQ_CMP_EVT 参数一是GAP连接请求处理完毕的event的id
* @param[in] param Pointer to struct gap_le_create_conn_req_cmp_evt 参数二是这个event的struct的指针.
* @param[in] dest_id TASK_APP 目的设备的id
* @param[in] src_id TASK_GAP 源设备的id
*
* @return If the message was consumed or not. return是消息是否成功发送.
* @description
*
* This handler is used to inform the application the outcome of connection establishment.
****************************************************************************************
*/
#if (!BLE_BROADCASTER && !BLE_OBSERVER) //确定一下不是广播或者观察设备.
int app_gap_le_create_conn_req_cmp_evt_handler(ke_msg_id_t const msgid, struct gap_le_create_conn_req_cmp_evt const *param,
ke_task_id_t const dest_id, ke_task_id_t const src_id) //参数跟函数名.
{
QPRINTF("Connection with %02X%02X%02X%02X%02X%02X result is 0x%x.\r\n", //打印一下, 这个连接上来的设备是谁, 地址多少, 这个地址会变化, 应该不是mac地址...
param->conn_info.peer_addr.addr[5],
param->conn_info.peer_addr.addr[4],
param->conn_info.peer_addr.addr[3],
param->conn_info.peer_addr.addr[2],
param->conn_info.peer_addr.addr[1],
param->conn_info.peer_addr.addr[0],
param->conn_info.status);
if (APP_ADV == ke_state_get(TASK_APP)) //这里TASK_APP, 是在一个在ke_task.h的文件里面定义的, 我看了一下, 跟OSAL的定义很像, 定义了一个枚举类型, 里面有两个是app层面的task, 一个叫TASK_APP, 另一个叫TASK_USER, 这里的意思是确定一下当前的state是广告
{
ke_state_set(TASK_APP, APP_IDLE); //既然连接上了, 就把state设置成APP_IDLE
app_set_role(GAP_PERIPHERAL_SLV); //然后把角色设置成peripheral还是个slave
}
else
{
app_set_role(GAP_CENTRAL_MST); //如果当前不是广告的, 是这个设备主动连的人家, 那就是central+master了.
}
if (param->conn_info.status == CO_ERROR_NO_ERROR) //这里是连接出错的处理
{
app_set_link_status_by_conhdl(param->conn_info.conhdl, ¶m->conn_info, true);
// Enable service here, for Server init phase 2
#if (BLE_PERIPHERAL) //如果设备设置成peripheral, 那么就要启动server, 提供service
app_enable_server_service(true, param->conn_info.conhdl);
#endif
}
app_task_msg_hdl(msgid, param); //这里估计就跟OSAL一样, 将标记恢复成已处理状态, 避免事件被重复执行.
return (KE_MSG_CONSUMED);
}
#endif
上面是连接成功, 紧接着断开就不分析了, 差不多.
来看看写入char的值是如何处理的.
在app_qpps_task.c里面, 有个app_qpps_data_ind_handler的函数.
///Client value send to APP
QPPS_DAVA_VAL_IND,
****************************************************************************************
* @brief Handles the data ind message from the QPPS. *//**
*
* @param[in] msgid QPPS_DAVA_VAL_IND 看上面的define, 内意思, 这个时候, client, 就是手机, 发送了数据给server, 即9020
* @param[in] param Pointer to the struct qpps_data_val_ind 数据都在这儿了.
* @param[in] dest_id TASK_APP
* @param[in] src_id TASK_QPPS
*
* @return If the message was consumed or not.
* @description
* This handler is used to handle the data sent form peer device
*
****************************************************************************************
*/
int app_qpps_data_ind_handler(ke_msg_id_t const msgid,
struct qpps_data_val_ind *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
if (param->length > 0)
{
QPRINTF("len=%d, I%02X", param->length, param->data[0]);
}
QPRINTF("\r\n");
return (KE_MSG_CONSUMED);
}
我xue微的修改一下, 把内容打印一下吧.
unsigned int i;
QPRINTF("Client sent:");
if (param->length > 0)
{
//QPRINTF("len=%d, I%02X", param->length, param->data[0]);
for(i=0;i<param->length;i++){
QPRINTF("%02X ", param->data[i]);
}
}
QPRINTF("\r\n");
欧了.
NXP QN9020的更多相关文章
- NXP NFC移植及学习笔记(原创)
NFC功能介绍 NFC 目前使用的三种功能: 1. P2P模式:基于LLCP协议的基础上,以NDEF数据交换格式来通信. 2. 读写模式:当作为读卡器,对NFC Tag的读写. 3. 卡模拟模式:模块 ...
- NXP恩智浦P89V51RB2/RC2/RD2单片机解密芯片破解方法!
NXP恩智浦P89V51RB2/RC2/RD2单片机解密芯片破解 P89V51RB2/RC2/RD2是一款80C51微控制器,包含16/32/64kB Flash和1024字节的数据RAM. P89V ...
- NXP恩智浦P89V52X2单片机破解P89C52X2BA芯片解密技术分享!
NXP恩智浦P89V52X2单片机破解P89C52X2BA芯片解密 P89V52X2是一款带有8kB Flash.256B数据RAM和192B数据EEPROM的80C51微控制器.这个器件可以在完全替 ...
- NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解多少钱?
NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解 芯片解密型号: P87C51x2.P87C52x2.P87C54x2.P87C58x2.P87C591 单片机解密 #####[ ...
- NXP Mifare S50标准IC卡- 访问位(Access Bits) 分析
Mifare S50 标准IC卡有1K 字节的EEPROM,主要用来存储数据和控制信息.1K 字节的EEPROM分成16 个区,每区又分成4 段,每1段中有16 个字节.每个区的最后一个段叫“尾部&q ...
- Cortex-M0(NXP LPC11C14)启动代码分析
作者:刘老师,华清远见嵌入式学院讲师. 启动代码的一般作用 1.堆和栈的初始化: 2.向量表定义: 3.地址重映射及中断向量表的转移: 4.初始化有特殊要求的断口: 5.处理器模式: 6.进入C应用程 ...
- NXP开源自动驾驶计算平台Bluebox 打造现实无人汽车
知名半导体制造商恩智浦NXP已经准备好了自家的自动驾驶计算开源平台Bluebox,将为汽车制造商提供现成的一体化自动 驾驶计算解决方案.专为自动驾驶设备的BlueBox中央计算引擎.不仅能够为无人驾驶 ...
- Cheap CK100 1024 tokens NXP FIX Chip on Eobd2
CK100 is a well-known and cost-effective key programmer for many cars. Some said it is a must for bo ...
- NXP LPC11xx I2C Slave 从机程序
/**************************************************************************** * $Id:: i2cslave.c 363 ...
随机推荐
- 用CocoaPods做iOS程序的依赖管理
CocoaPods简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm.随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的 ...
- Java Map 按Key排序和按Value排序
Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value). 1.按键排序 jdk内置的java.util包下的Tr ...
- Trace-导出已有的服务器端跟踪
跟踪(Trace)常被我们用来检查性能问题.通常我们会有针对CPU.Duration.Reads的创建跟踪定义,这一类的脚本一般不会包含太多的事件和列,筛选条件也相对简单.假如某一天你使用GUI定义了 ...
- ThinkPHP 自动验证与自动填充无效可能的原因(转)
自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇到自动验证与自动填充无效的情况,本文就ThinkPHP 自动验证与自动填充无效可能的原因做一些分析. create() Think ...
- Java多线程实现
1.继承Thread类,由于Java单继承特性,此方法并不推荐. 2.实现Runnable接口,代码如下 class MyThread implements Runnable { private St ...
- 帮你深入理解OAuth2.0协议
1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...
- log4j2.x 配置文件默认寻找顺序
Automatic Configuration Log4j has the ability to automatically configure itself during initializatio ...
- docker offical docs:Working with Containers
enough ---------------------------------------------------------------------------------- Working wi ...
- Eclipse中进行Gradle+Jetty部署的web项目的断点调试
1.自行配置好build.gradle文件和按照gradle的web项目目录结构规范建立java.resourece和webapp文件夹 可在build.gradle文件中自由设定“http端口” 1 ...
- vi/vim 键盘图 & 替换
在VIM中进行文本替换: 1. 替换当前行中的内容: :s/from/to/ (s即substitude) :s/from/to/ : 将当前行中的第一个f ...