【CC2640R2F】香瓜CC2640R2F之从机通信状态的显示

转载自:

https://blog.csdn.net/feilusia/article/details/78642674

一、本节简介

本节以simple_peripheral工程为例,介绍如何添加从机通信状态的显示,如显示“Advertising”、“Connected”等状态。

 

二、实验平台

1)CC2640R2F平台

①协议栈版本:CC2640R2 SDK v1.40.00.45

②编译软件:CCS7.3.0.00019

③硬件平台:香瓜CC2640R2F开发板

④仿真器:香瓜XDS100V3下载器

2)手机平台
①手机型号:红米1S
②安卓版本:安卓4.3
③安卓app:BLE Reader

 

三、版权声明

1)作者:甜甜的大香瓜

2)声明:喝水不忘挖井人,转载请注明出处。

3)纠错/业务合作:897503845@qq.com

4)香瓜BLE之CC2640R2F群:557278427

5)本文出处:原创连载资料《简单粗暴学蓝牙5》

6)完整开源资料下载地址(电脑端打开):

https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

7)香瓜CC2640R2F开发板购买链接:

https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4023-16963296339.8.21bfc58419sWKt&id=558653143169

 

8)香瓜XDS100V3下载器购买链接:

https://item.taobao.com/item.htm?spm=a230r.1.14.1.1d150040zvJBco&id=558356989143&ns=1&abbucket=6#detail

 

四、实验前提

1、在进行本文步骤前,请先阅读以下章节:

1)《简单粗暴学蓝牙5》的“第一章至第四章”章节​。

 

2、在进行本文步骤前,请先实现以下章节:

1)《简单粗暴学蓝牙5》的“第三章 软件的安装及使用”章节。

2)《简单粗暴学蓝牙5》的《香瓜CC2640R2F之LCD》http://blog.csdn.net/feilusia/article/details/78371371

 

五、基础知识

1、从机通信状态是指什么?
答:
在peripheral.h中有介绍

  1. /// @brief GAP Peripheral Role States.

  2. typedef enum

  3. {

  4. GAPROLE_INIT = 0, //!< Waiting to be started

  5. GAPROLE_STARTED, //!< Started but not advertising

  6. GAPROLE_ADVERTISING, //!< Currently Advertising

  7. GAPROLE_ADVERTISING_NONCONN, //!< Currently using non-connectable Advertising

  8. GAPROLE_WAITING, //!< Device is started but not advertising, is in waiting period before advertising again

  9. GAPROLE_WAITING_AFTER_TIMEOUT, //!< Device just timed out from a connection but is not yet advertising, is in waiting period before advertising again

  10. GAPROLE_CONNECTED, //!< In a connection

  11. GAPROLE_CONNECTED_ADV, //!< In a connection + advertising

  12. GAPROLE_ERROR //!< Error occurred - invalid state

  13. } gaprole_States_t;

其中,我们最关心的是如下几种状态:

1)GAPROLE_STARTED:表明蓝牙初始化结束,此时可以显示本机的mac地址、显示"Initialized"。

2)GAPROLE_ADVERTISING:表明当前蓝牙已在广播,此时显示"Advertising"。

3)GAPROLE_CONNECTED:表明当前已被主机连接上了,此时显示“Connected”。

4)GAPROLE_WAITING:表明当前已与主机断开连接,比如主机主动断开、强行关闭手机的蓝牙app、强行关闭手机的蓝牙开关、强行手机关机,此时显示"Disconnected"。


2、为何要为这些状态增加显示?

答:

有了通信状态显示,可以更直观地知道设备运行的状态。是很实用的功能。

 

六、硬件原理

暂无

 

七、实验步骤

1、修改状态回调函数(替换simple_peripheral.c的SimpleBLEPeripheral_processStateChangeEvt函数)

  1. static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState)

  2. {

  3. #ifdef PLUS_BROADCASTER

  4. static bool firstConnFlag = false;

  5. #endif // PLUS_BROADCASTER

  6.  
  7. //蓝牙状态

  8. switch ( newState )

  9. {

  10. //蓝牙初始化好时

  11. case GAPROLE_STARTED:

  12. {

  13. uint8_t ownAddress[B_ADDR_LEN];

  14. uint8_t systemId[DEVINFO_SYSTEM_ID_LEN];

  15.  
  16. //获取本设备的8字节mac地址

  17. GAPRole_GetParameter(GAPROLE_BD_ADDR, ownAddress);

  18.  
  19. //将8字节mac地址转为6字节系统ID

  20. // use 6 bytes of device address for 8 bytes of system ID value

  21. systemId[0] = ownAddress[0];

  22. systemId[1] = ownAddress[1];

  23. systemId[2] = ownAddress[2];

  24.  
  25. // set middle bytes to zero

  26. systemId[4] = 0x00;

  27. systemId[3] = 0x00;

  28.  
  29. // shift three bytes up

  30. systemId[7] = ownAddress[5];

  31. systemId[6] = ownAddress[4];

  32. systemId[5] = ownAddress[3];

  33.  
  34. //保存系统ID

  35. DevInfo_SetParameter(DEVINFO_SYSTEM_ID, DEVINFO_SYSTEM_ID_LEN, systemId);

  36.  
  37. //显示(协议栈原显示驱动未用,使用香瓜的显示驱动)

  38. // Display device address

  39. Display_print0(dispHandle, SBP_ROW_BDADDR, 0, Util_convertBdAddr2Str(ownAddress));

  40. Display_print0(dispHandle, SBP_ROW_ROLESTATE, 0, "Initialized");

  41.  
  42. //GUA

  43. GUA_LCD_WriteString(Util_convertBdAddr2Str(ownAddress), GUA_LCD_LINE4);

  44. GUA_LCD_WriteString("Initialized", GUA_LCD_LINE5);

  45. //GUA

  46. }

  47. break;

  48.  
  49. //开始广播时

  50. case GAPROLE_ADVERTISING:

  51. Display_print0(dispHandle, SBP_ROW_ROLESTATE, 0, "Advertising");

  52. //GUA

  53. GUA_LCD_WriteString("Advertising", GUA_LCD_LINE5);

  54. //GUA

  55. break;

  56.  
  57. #ifdef PLUS_BROADCASTER

  58. // After a connection is dropped, a device in PLUS_BROADCASTER will continue

  59. // sending non-connectable advertisements and shall send this change of

  60. // state to the application. These are then disabled here so that sending

  61. // connectable advertisements can resume.

  62. case GAPROLE_ADVERTISING_NONCONN:

  63. {

  64. uint8_t advertEnabled = FALSE;

  65.  
  66. // Disable non-connectable advertising.

  67. GAPRole_SetParameter(GAPROLE_ADV_NONCONN_ENABLED, sizeof(uint8_t),

  68. &advertEnabled);

  69.  
  70. advertEnabled = TRUE;

  71.  
  72. // Enabled connectable advertising.

  73. GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t),

  74. &advertEnabled);

  75.  
  76. // Reset flag for next connection.

  77. firstConnFlag = false;

  78.  
  79. SimpleBLEPeripheral_freeAttRsp(bleNotConnected);

  80. }

  81. break;

  82. #endif //PLUS_BROADCASTER

  83.  
  84. //连接时

  85. case GAPROLE_CONNECTED:

  86. {

  87. linkDBInfo_t linkInfo;

  88. uint8_t numActive = 0;

  89.  
  90. //开启周期事件

  91. Util_startClock(&periodicClock);

  92.  
  93. //获取已连接设备总数

  94. numActive = linkDB_NumActive();

  95.  
  96. // Use numActive to determine the connection handle of the last

  97. // connection

  98. //提取到了设备信息,则说明之前已有连接设备,则显示已连接设备总数、显示此刻连接上的主机地址

  99. if ( linkDB_GetInfo( numActive - 1, &linkInfo ) == SUCCESS )

  100. {

  101. Display_print1(dispHandle, SBP_ROW_ROLESTATE, 0, "Num Conns: %d", (uint16_t)numActive);

  102. Display_print0(dispHandle, SBP_ROW_STATUS_1, 0, Util_convertBdAddr2Str(linkInfo.addr));

  103.  
  104. //GUA

  105. GUA_LCD_WriteStringValue("Num Conns:", (uint16_t)numActive, 10, GUA_LCD_LINE5); //显示当前连接数

  106. GUA_LCD_WriteString(Util_convertBdAddr2Str(linkInfo.addr), GUA_LCD_LINE6); //显示最后连接的主机地址

  107. //GUA

  108. }

  109. //提取不到设备信息,则说明之前没有已连接设备,则显示此刻的设备已连接、显示此刻连接上的主机地址

  110. else

  111. {

  112. uint8_t peerAddress[B_ADDR_LEN];

  113.  
  114. GAPRole_GetParameter(GAPROLE_CONN_BD_ADDR, peerAddress);

  115.  
  116. Display_print0(dispHandle, SBP_ROW_ROLESTATE, 0, "Connected");

  117. Display_print0(dispHandle, SBP_ROW_STATUS_1, 0, Util_convertBdAddr2Str(peerAddress));

  118.  
  119. //GUA

  120. GUA_LCD_WriteString("Connected", GUA_LCD_LINE5); //显示为已连接

  121. GUA_LCD_WriteString(Util_convertBdAddr2Str(peerAddress), GUA_LCD_LINE6); //显示当前连接的主机地址

  122. //GUA

  123. }

  124.  
  125. #if !defined(Display_DISABLE_ALL)

  126. tbm_setItemStatus(&sbpMenuMain, TBM_ITEM_ALL, TBM_ITEM_NONE);

  127. #endif // !Display_DISABLE_ALL

  128.  
  129. #ifdef PLUS_BROADCASTER

  130. // Only turn advertising on for this state when we first connect

  131. // otherwise, when we go from connected_advertising back to this state

  132. // we will be turning advertising back on.

  133. if (firstConnFlag == false)

  134. {

  135. uint8_t advertEnabled = FALSE; // Turn on Advertising

  136.  
  137. // Disable connectable advertising.

  138. GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t),

  139. &advertEnabled);

  140.  
  141. // Set to true for non-connectable advertising.

  142. advertEnabled = TRUE;

  143.  
  144. // Enable non-connectable advertising.

  145. GAPRole_SetParameter(GAPROLE_ADV_NONCONN_ENABLED, sizeof(uint8_t),

  146. &advertEnabled);

  147. firstConnFlag = true;

  148. }

  149. #endif // PLUS_BROADCASTER

  150. }

  151. break;

  152.  
  153. //连接时广播

  154. case GAPROLE_CONNECTED_ADV:

  155. Display_print0(dispHandle, SBP_ROW_ROLESTATE, 0, "Connected Advertising");

  156. //GUA

  157. GUA_LCD_WriteString("Connected Advertising", GUA_LCD_LINE5);

  158. //GUA

  159. break;

  160.  
  161. //设备启动了但是没有广播出来,等待下一次广播

  162. case GAPROLE_WAITING:

  163. Util_stopClock(&periodicClock);

  164. SimpleBLEPeripheral_freeAttRsp(bleNotConnected);

  165.  
  166. Display_print0(dispHandle, SBP_ROW_ROLESTATE, 0, "Disconnected");

  167.  
  168. #if !defined(Display_DISABLE_ALL)

  169. // Disable PHY change

  170. tbm_setItemStatus(&sbpMenuMain, TBM_ITEM_NONE, TBM_ITEM_ALL);

  171. #endif // !Display_DISABLE_ALL

  172.  
  173. // Clear remaining lines

  174. Display_clearLines(dispHandle, SBP_ROW_RESULT, SBP_ROW_STATUS_2);

  175.  
  176. //GUA

  177. GUA_LCD_WriteString("Disconnected", GUA_LCD_LINE5);

  178. GUA_LCD_ClearLine(GUA_LCD_LINE6);

  179. //GUA

  180.  
  181. break;

  182.  
  183. //等待超时

  184. case GAPROLE_WAITING_AFTER_TIMEOUT:

  185. SimpleBLEPeripheral_freeAttRsp(bleNotConnected);

  186.  
  187. Display_print0(dispHandle, SBP_ROW_RESULT, 0, "Timed Out");

  188.  
  189. #if !defined(Display_DISABLE_ALL)

  190. tbm_setItemStatus(&sbpMenuMain, TBM_ITEM_NONE, TBM_ITEM_ALL);

  191. #endif // !Display_DISABLE_ALL

  192.  
  193. // Clear remaining lines

  194. Display_clearLines(dispHandle, SBP_ROW_STATUS_1, SBP_ROW_STATUS_2);

  195.  
  196. //GUA

  197. GUA_LCD_WriteString("Timed Out", GUA_LCD_LINE5);

  198. GUA_LCD_ClearLine(GUA_LCD_LINE6);

  199. //GUA

  200.  
  201. #ifdef PLUS_BROADCASTER

  202. // Reset flag for next connection.

  203. firstConnFlag = false;

  204. #endif // PLUS_BROADCASTER

  205. break;

  206.  
  207. //异常状态时

  208. case GAPROLE_ERROR:

  209. Display_print0(dispHandle, SBP_ROW_RESULT, 0, "Error");

  210. //GUA

  211. GUA_LCD_WriteString("Error", GUA_LCD_LINE5);

  212. //GUA

  213. break;

  214.  
  215. default:

  216. Display_clearLines(dispHandle, SBP_ROW_RESULT, SBP_ROW_STATUS_2);

  217. //GUA

  218. GUA_LCD_ClearLine(GUA_LCD_LINE6);

  219. //GUA

  220. break;

  221. }

  222.  
  223. }

增加了oled显示、增加了部分注释。

八、注意事项
暂无


九、实验结果
仿真并全速运行,可以看到:

1、上电后自动广播的显示

2、连接后的显示

 

注:由于断开连接等状态显示的时间过短,会快速地被重新广播刷新掉,所以其他状态只有仿真设置断点时能看到。

因此,实验成功。

 

转载自:

https://blog.csdn.net/jacklondonjia/article/details/78685746

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值