回答

收藏

【Telink-泰凌微电子 B91通用开发套件】⑦手机蓝牙控制点灯

泰凌微电子 泰凌微电子 1128 人阅读 | 0 人回复 | 2022-11-03

玩了好几天的板卡,今天来动手做个小Demo吧,作为一个高级点灯工程师,就用手机蓝牙控制板卡点灯吧,主要目的是打通一下手机和板卡之间的通讯链路。

首先我们选择使用上次的“Bluetooth? LE Generic”这个SDK中的“B91_module”这个DEMO,他里面跑的是SPP协议(代码中是这么叫的,我也跟着一起这么叫吧)。DEMO的效果就是B91上有一个串口,通过一个协议可以控制蓝牙的一些配置,还可以实现手机->B91->串口、串口->B91->手机之间数据的传输。可惜我没有找到合适的一个文档来说明这个串口协议是如何使用的,如果你想了解的话,只能自己去看看源码了,今天我不会详细使用这个协议,所以不做太多的讲解


该Demo需要外接一个串口,用于跑对应的SPP协议,在app.c中的user_init_normal()中可以找到串口初始化函数,他配置了使用的串口引脚和波特率

程序烧录后,手机可以搜索到一个名字叫“KModule”的蓝牙

连接成功,串口会定时打印“FF 02 8C 07”,该信息代表的是通道MAP更新事件


手机发一下数据到模块


发送0x41424344
串口收到如下数据

可以看到数据已经收到了,前面的FF-00之间的数据不管他,这是协议上的事,这边不细讲。41-44就是我们收到的数据

接下来就开始改造这个Demo,首先第一步就是要知道,我在那个函数中可以得到手机发过来的数据?
这个我们可以直接看Attribute Table,他就在app_att.c中,关于这个的先关介绍可以看SDK手册的“3.3.3 ATT & GATT”里面有详细的介绍,在下图位置就是注册刚才我们使用的那个服务收到数据的回调函数


我们来看一下回调函数
  1. int module_onReceiveData(u16 connHandle, rf_packet_att_write_t *p)
  2. {
  3.         u16 len = p->l2capLen - 3;
  4.         if(len > 0)
  5.         {
  6.                 spp_event_t *pEvt =  (spp_event_t *)p;
  7.                 pEvt->token = 0xFF;
  8.                 pEvt->paramLen = p->l2capLen + 2;   //l2cap_len + 2 byte (eventId)
  9.                 pEvt->eventId = 0x07a0;  //data received event
  10.                 memcpy(pEvt->param, &p->opcode, len + 3);

  11.                 spp_send_data(HCI_FLAG_EVENT_TLK_MODULE, pEvt);
  12.         }

  13.         return 0;
  14. }
复制代码
其中&p->opcode就是我们收到的数据(事实上他的第一字节不是,而是一个0x00,我还没明白这是为什么),那么我们就可以简单地改造一下这个函数,当我收到4个0xAA时,我就点灯,4个0xBB我就灭灯。
  1. int module_onReceiveData(u16 connHandle, rf_packet_att_write_t *p)
  2. {
  3.         u16 len = p->l2capLen - 3;
  4.         uint8_t dataAA[5] = {0x00, 0xAA, 0xAA, 0xAA, 0xAA};
  5.         uint8_t dataBB[5] = {0x00, 0xBB, 0xBB, 0xBB, 0xBB};
  6.         spp_event_t *pEvt =  (spp_event_t *)p;
  7.         if(len > 0)
  8.         {
  9.                
  10.                 pEvt->token = 0xFF;
  11.                 pEvt->paramLen = p->l2capLen + 2;   //l2cap_len + 2 byte (eventId)
  12.                 pEvt->eventId = 0x07a0;  //data received event
  13.                 memcpy(pEvt->param, &p->opcode, len + 3);
  14.         }
  15.        
  16.         if (0 == memcmp(&dataAA[0], &p->opcode, 5))
  17.         {
  18.                 gpio_write(GPIO_LED_GREEN, LED_ON_LEVAL);
  19.                 spp_send_data(HCI_FLAG_EVENT_TLK_MODULE, pEvt);
  20.         }
  21.         else if (0 == memcmp(&dataBB[0], &p->opcode, 5))
  22.         {
  23.                 gpio_write(GPIO_LED_GREEN, !LED_ON_LEVAL);
  24.                 spp_send_data(HCI_FLAG_EVENT_TLK_MODULE, pEvt);
  25.         }
  26.        
  27.         return 0;
  28. }
复制代码
视频演示:

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条