TI中文支持网
TI专业的中文技术问题搜集分享网站

按键值的问题。

你好,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, &noti, FALSE);//handle为0,是否只是单机相连接才有效。

static uint16 gapConnHandle;

GATTServApp_ReadCharCfg(gapConnHandle, skConfig);

GATT_Notification(gapConnHandle, &noti, 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

赞(0)
未经允许不得转载:TI中文支持网 » 按键值的问题。
分享到: 更多 (0)