你好,Yan
求解一个问题,就是按键值都是单字节,我跟踪发现static uint8 skKeyPressed = 0,不能改成双字节。keyfobapp_HandleKeys的SK_SetParameter( SK_KEY_ATTR, sizeof ( uint8 ), &SK_Keys ); 确定了每按一次键,只能是1个字节的键值。我想按一次产生双字节键值,怎么办?还有sk_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen )中读两个字节 case SK_KEYPRESSED_UUID:
*pLen = 2; pValue[0] = *pAttr->pValue; pValue[1] ????如何表示,
break;
谢了。万分感谢!!!!
Yan:
lincoln,
SK_SetParameter( SK_KEY_ATTR, 2, &SK_Keys ); 表示可以发送两个字节。
读两个字节, pValue[1] = *(pAttr->pValue+1);
读两个字节的前提是,你必须修改simplekeys.c中skKeyPressed的定义,改成两字节的数组,同时修改 simplekeysAttrTbl[] 中的skKeyPressed 引用,去掉“&”
最后,如果编译有错,请对应的一一修改。
lincoln guan:
回复 Yan:
谢了,yan。按你的要求做了如下改动,能编译通过。
1)SK_SetParameter( SK_KEY_ATTR, sizeof ( uint8 ), &SK_Keys ); *skKeyPressed = *((uint8*)pValue); // See if Notification/Indication has been enabled GATTServApp_ProcessCharCfg( skConfig, skKeyPressed, FALSE, simplekeysAttrTbl, GATT_NUM_ATTRS( simplekeysAttrTbl ), INVALID_TASK_ID );
2)static uint8 sk_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen ) case SK_KEYPRESSED_UUID: *pLen = 2; pValue[0] = *pAttr->pValue; pValue[1] = *(pAttr->pValue+1);
改成数组了,编译ok,结果跟uint16定义一样也只得到1个字节内容是对的。另一个00或FF。也没得到。
可能哪里还有问题。
还有几个问题请教:
1)GATTServApp_ReadCharCfg(0, skConfig);//handle为0,是否只是单机相连接才有效。GATT_Notification(0, ¬i, FALSE);//handle为0,是否只是单机相连接才有效。
static uint16 gapConnHandle;
GATTServApp_ReadCharCfg(gapConnHandle, skConfig);
GATT_Notification(gapConnHandle, ¬i, FALSE);GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle );//gapConnHandle是否是通过这个函数取得
2)
我用packet sniffer抓包,把广播单独设成37,38,39频道还是抓不到包。(按你讲设置数值1,2,4等)clock mulitiplier 为1.0是否要修改。connect to initiator address:设置成被抓包地址,dongle地址
怎能都只是广告包,数据包抓不到,是否可能还有其它什么原因。
万分感谢!
祝好!
Lincoln
lincoln guan:
回复 lincoln guan:
yan,你好,*skKeyPressed = *((uint8*)pValue); >>>用osalmemcpy函数能得到2个正确字节了。按键值,在keyfobapp_handlekeys函数得到了。弹起时的键值在哪个函数能得到。其它几个问题也帮我回下。谢了。
lincoln
lincoln guan:
回复 lincoln guan:
yan,你好,还一个问题,就是用lightblue测试,总能发现第一个16byte的service uuid。但程序中好象找不到,不知是哪里来的。谢了。
祝好
lincoln
lincoln guan:
回复 Yan:
Yan,你好!
帮我一下,除了前面的一太堆问题,还有几个问题:
1)如果自己单独定义service uuid,charateristic uuid,是否要写_readattrcb(****),_writeattrcb(****),还要写其它什么函数吗?
2)我用lightblue能看到manufacturer data,这个是干什么的。
万分感谢。
祝好
lincoln
Yan:
回复 lincoln guan:
hi lincon,
1, handle 为0,的确是单连接状态。作为slave,目前也不会有多连接状态。如果作为master的话,连接上多个slave之后,这个数字就会累加。
connection handle可以通过GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle );得到。
2.clock multiplier不需要改,代码里面改成37, 38, 或39之后,packet sniffer里面也要设置成相应的频道。
lincoln guan:
回复 Yan:
好的,谢了。
1) 是按你讲的在代码与sniffer同时设置的,还是抓不着。不知什么原因,难道很难抓吗?
2)按你所讲,GATTServApp_ProcessCharCfg与GATT_Notification 的区别,GATTServApp_ProcessCharCfg最终会导致master那边调用一个read请求, 然后调用到keyfob这边的sk_ReadAttrCB()。GATT_Notification判断Notification 打开就发给master。我用btool测试,uuid找到handle,加1,在下面写入01:00,抓到的数据是对的。如果不写。好像GATT_Notification也没反应。
3)如果直接跟app通讯。我们这边用GATTServApp_ProcessCharCfg与GATT_Notification 。我们在keyfob这边如何知道app那边是否打开notification了。是在sk_writeAttrCB()回调函数中拦截吗?在keyfob这边有什么办法确认在与手机app通讯后,手机那端notification是打开的。因为app是另一家公司写。我现在这边按你的方式送给它的数据,用btool测试是对的。但跟手机app对不上。因此我想从我这边来判断。
4)蓝牙协议栈1.3.2是否支持android4.3.
谢了
祝好
lincoln
Yan:
回复 lincoln guan:
lincon,
1, 很奇怪,我这样设置每次都是能抓到包的。
2. 你说的没错,notification必须被使能之后才能起作用。
3. BTool正常,说明你的代码是正确的。第三方的手机app, 对方并不确定你的notification使能的handle的位置,因此应该无法使能你的notification. 你可以在writeAttrCB()中进行拦截判断是否notification的使能请求被收到。
lincoln guan:
回复 Yan:
谢了,yan
确认是app没使能notification,我们有什么办法设置成它需要的handle。
谢谢。
祝好
lincoln
lincoln guan:
回复 lincoln guan:
你好,yan
GATTServApp_ProcessCharCfg 最终会导致master那边调用一个read请求, 然后调用sk_ReadAttrCB()。它是靠performperiodicktask()这个函数还是靠sk_writeAttrCB()来处理master的read请求?
谢了。
祝好
lincoln