首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 DCS

CC2541连接ANCS服务

嵌入式 | 发布时间:2017-11-26 | 人气: | #评论# | 本文关键字:ANCS,BLE
摘要:苹果的ANCS实际上是基于BLE协议所实现的一项技术。苹果公司专门为通知中心建立一个规范(Profile),并定义了相应的服务。通过这种方式,BLE设备就能访问手机等iOS设备通知中心,实时关注iOS设

苹果的ANCS实际上是基于BLE协议所实现的一项技术。苹果公司专门为通知中心建立一个规范(Profile),并定义了相应的服务。通过这种方式,BLE设备就能访问手机等iOS设备通知中心,实时关注iOS设备的动向。这个技术非常适用于穿戴设备(如智能手环、智能手表等)。

还原ANCS的真面目,其实就是BLE协议的一个简单应用而已。ANCS作GATT的服务器,提供一个服务(Service),该服务包含三个特征(Characteristic):

· 通知源特征(Notification Source Characteristic)

· 控制点特征(Control Point Characteristic)

· 数据源特征(Data Source Characteristic)。

其中通知源特征可提供简单的通知,告诉GATT客户端收到多少条什么类型的消息;控制点特征专门用于接收GATT客户端发送过来的控制命令;数据源特征则提供详细的通知。

ANCS的服务及特征都存在唯一128位的UUID。如下:

· 主服务UUID:    7905F431-B5CE-4E99-A40F-4B1E122D00D0

· 通知源特征UUID:9FBF120D-6301-42D9-8C58-25E699A21DBD

· 控制点特征UUID:69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9

· 数据源特征UUID:22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB

上面的三种特征中,只有控制点特征设置成可写特征的;而通知源特征与数据源特征都设置为可通知特征。对于通知源特征和数据源特征来说,想要发送通知,必须各配一个客户端特征配置描述符(Client Characteristic Configuration Description, CCCD)。当然这些ANCS都已经配置好了,不需要我们在再做什么。

 上面介绍这么多ANCS,目的主要是为BLE设备连接上iOS设备的ANCS做铺垫。下面就讲讲如何连接上iOS设备的ANCS服务。

1、配对与绑定

由于ANCS服务的各特征都需要认证的,所以BLE设备想要获取ANCS服务,必须要与iOS设备配对与绑定。BLE设备第一次连接上iOS设备时,需要进行配对。为了下一次快速连接,还需要进行绑定,存储配对信息,这样的话下次连接就不需要再次进行配对了。BLE设备,以TI CC2541为例,要实现绑定,需如下设置:

/* Setup the GAP Bond Manager */

{

  uint32 passkey = 000000;

  uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;

  uint8 mitm = FALSE;

  uint8 ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;

  uint8 bonding = TRUE;

     GAPBondMgr_SetParameter(GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey );

  GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode );

  GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm );

  GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap );

  GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );

}

这里考虑到ANCS的使用场景为穿戴设备,可能会没有显示屏,故不设置密码。所以这里将输入输出能力ioCap设为:无输入无输出(GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT),将中间人攻击mitm设置为FALSE,表示不需要密码。

2、寻找ANCS的服务

连接上iOS设备后,就需要寻找ANCS的服务。前文说过,ANCS其实是一个规范(Profile),所以第一件事需要做的就是寻找它所支持的服务。已知ANCS的主服务UUID为:7905F431-B5CE-4E99-A40F-4B1E122D00D0,所以就可使用函数DiscPrimaryServiceByUUID(),根据服务的UUID来寻找ANCS的主服务,如下:

uuid[ATT_UUID_SIZE] = /*7905F431-B5CE-4E99-A40F-4B1E122D00D*/

{

  0xd0,0x00,0x2d,0x12,0x1e,0x4b,0x0f,0xa4,

  0x99,0x4e,0xce,0xb5,0x31,0xf4,0x05,0x79

}

GATT_DiscPrimaryServiceByUUID( AppleANCSConnHandle, uuid, ATT_UUID_SIZE,  AppleANCSTaskId );

iOS收到寻找主服务请求后,会返回响应,响应数据中包含服务的起始句柄和结束句柄,如我收到的起始句柄与结束句柄分别为:

服务起始句柄svcStartHdl = 25

服务结束句柄svcEndHdl = 34

3、寻找ANCS服务的特征

寻找到服务后,就要开始寻找服务的特征。我们知道ANCS存在三个特征:通知源特征、控制点特征、数据源特征。为了找到三个特征,可以使用函数GATT_DiscAllChars()。这个函数可以找出某个句柄范围之内的所有特征,我们只要寻找服务起始句柄和结束句柄之间的特征,就可以找到ANCS的三个特征了,如下:

GATT_DiscAllChars( AppleANCSConnHandle, svcStartHdl, svcEndHdl, AppleANCSTaskId );

iOS收到特征寻找请求后,会返回响应,响应数据包含各个的特征的信息,包括句柄和UUID等。再根据收到的UUID就可判断是ANCS的哪个特征,然后保存相应的句柄。如,我收到的特征对应句柄如下:

控制点特征句柄为ntfSrcHdl = 27

通知源特征起始句柄为ctlPntStartHdl = 30

通知源特征结束句柄为ctlPntEndHdl = 31

数据源特征句柄为datSrcStartHdl = 33

数据源特征句柄为datSrcEndHdl = 34

4、寻找CCCD

ANCS服务的三个特征中,通知源特征和数据源特征都是可通知的,它们都存在CCCD(Client Characteristic Configuration Description) ,所以对于这两个特征,还需将它们的CCCD找出来。使用GATT_DiscAllCharDescs()可以分来两次分别查找通知源特征和数据源特征的CCCD,如下:

GATT_DiscAllCharDescs(AppleANCSConnHandle, ctlPntStartHdl  + 1, 

              ctlPntEndHdl , AppleANCSTaskId );

GATT_DiscAllCharDescs(AppleANCSConnHandle, datSrcStartHdl + 1, 

              datSrcEndHdl , AppleANCSTaskId );

iOS设备收到寻找CCCD请求后,会返回响应,响应数据包含CCCD所对应的句柄,然后将句柄记录下来,如:

通知源特征的CCCD为ntfSrcCCCDHdl = 31

数据源特征的CCCD为datSrcCCCDHdl = 34

5、启用通知

通知源与数据源特征需要启动才能发送通知。通过分别向这两个特征的CCCD发送命令可以打开通知功能,如下所示:

req.handle = ntfSrcCCCDHdl ;

req.len = 2;

req.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY);

req.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);        

req.sig = 0;

req.cmd = 0;

GATT_WriteCharValue( AppleANCSConnHandle, &req, AppleANCSTaskId );

req.handle = datSrcCCCDHdl ;

req.len = 2;

req.value[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY);

req.value[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);        

req.sig = 0;

req.cmd = 0;

GATT_WriteCharValue( AppleANCSConnHandle, &req, AppleANCSTaskId );

BLE设备也是用过CCCD句柄接收到iOS通知的。


责任编辑:电气自动化网
首页 | 电气资讯 | 应用技术 | 高压电器 | 电气设计 | 行业应用 | 低压电器 | 电路图 | 关于我们 | 版权声明

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版 原创声明:本站大部分内容为原创,转载请注明电气自动化网转载;部分内容来源网络,如侵犯您的权益请发送邮件到[email protected]联系我们删除。