在SimpleBLEble peripheral mode里面怎么理解UUID 和handle

BLE简介和Android BLE编程 - 推酷
BLE简介和Android BLE编程
一.BLE和BT区别
其实我知道许多程序员不太喜欢阅读除了代码以外的文档,因为有时这些过于冗长的文档对编程并没有更多的好处,有了协议,接口,demo差不多很多人就能写出很好质量的代码了。但其实更深入的编程是少了阅读的,阅读文档可以解决很多编程中遇到的困难,比如在大数据大流量情况下,很多正常的程序会表现出不可靠的一面,这已经不是够编程能解决的了,硬件的配置,服务器带宽,使用的数据库,调用的接口都有可能是瓶颈。比如BLE,同样的蓝牙,但却有着本质区别,一个表现就是不是所有蓝牙设备都支持BLE,编程如果不考虑这个问题,程序出错就会迷茫。再比如连接到BLE或者蓝牙上的设备是有数量限制的,如果不知道这个限制,在连接不上时,也会六神无主。
BLE在智家居中和移动设备中的应用方兴未艾,做深入的研究推广到更多的应用上,还是有意义的。
1蓝牙的历史:蓝牙的创始公司是爱立信。1994年爱立信开始对小范围无线通信技术进行研发,在1997年,爱立信的研究激发了其他公司的浓厚兴趣,于是1998年2月,一些跨国大公司包括诺基亚、苹果、三星组成的一个特殊兴趣小组(SIG),他们共同的目标是建立一个全球性的小范围无线通信技术,该项技术就是蓝牙。
2.BLE 是Bluetooth Low Energy的缩写,又叫蓝牙4.0,区别于蓝牙3.0和之前的技术。BLE前身是NOKIA开发的Wibree技术,主要用于实现移动智能终端与周边配件之间的持续连接,是功耗极低的短距离无线通信技术,并且有效传输距离被提升到了100米以上,同时只需要一颗纽扣电池就可以工作数年之久。
3. BLE是在蓝牙技术的基础上发展起来的,既同于蓝牙,又区别于传统蓝牙。BLE设备分单模和双模两种,双模简称BR,商标为Bluetooth Smart Ready,单模简称BLE或者LE,商标为Bluetooth Smart。Android是在4.3后才支持BLE,这可以解释不是所有蓝牙手机都支持BLE,而且支持BLE的蓝牙手机一般是双模的。
4.双模兼容传统蓝牙,可以和传统蓝牙通信,也可以和BLE通信,常用在手机上,android4.3和IOS4.0之后版本都支持BR,也就是双模设备。单模只能和BR和单模的设备通信,不能和传统蓝牙通信,由于功耗低,待机长,所以常用在手环的智能设备上。这可以解释手机上的BLE与手环等设备上的BLE的区别。
5不是所有手机都支持BLE,因为BLE不仅仅依靠软件实现,同时需要硬件支持,于是有很多手机不能联接智能手环等设备。Android4.3手机上安装的是双模BR,因此兼容蓝牙3.0之前的技术,既能与BLE设备通信,也能与传统蓝牙通信,比较耗电,能够像传统设备一样高速传输。大部分智能手环使用的单工BLE,不支持传统蓝牙,不能与之联结和通信,低功耗低速率设备。
二.BLE(低功耗蓝牙)的用途
应用特点:小包传输,手机扩展,低功耗
☆ 2.4G 蓝牙低功耗系统
☆ 消费类电子产品
☆ 秱劢电话外围扩展设备
☆ 运劢和休闲设备
☆ 健康医疗用品 (血压计,体温计 …)
☆ 汽车电子设备
☆ 人机接口设备 (键盘,鼠标,遥控器 …)
☆ USB Dongle
蓝牙的工作原理
蓝牙通信的主从关系
蓝牙技术规定每一对设备之间进行蓝牙通讯时,必须一个为主角色,另一为从角色,才能进行通信,通信时,必须由主端进行查找,发起配对,建链成功后,双方即可收发数据。理论上,一个蓝牙主端设备,可同时与7个蓝牙从端设备进行通讯。一个具备蓝牙通讯功能的设备,可以在两个角色间切换,平时工作在从模式,等待其它主设备来连接,需要时,转换为主模式,向其它设备发起呼叫。一个蓝牙设备以主模式发起呼叫时,需要知道对方的蓝牙地址,配对密码等信息,配对完成后,可直接发起呼叫。这可以解释为什么有时无法连接蓝牙,有可能是连接的蓝牙设备过多。
2蓝牙的呼叫过程
蓝牙主端设备发起呼叫,首先是查找,找出周围处于可被查找的蓝牙设备。主端设备找到从端蓝牙设备后,与从端蓝牙设备进行配对,此时需要输入从端设备的PIN码,也有设备不需要输入PIN码。配对完成后,从端蓝牙设备会记录主端设备的信任信息,此时主端即可向从端设备发起呼叫,已配对的设备在下次呼叫时,不再需要重新配对。已配对的设备,做为从端的蓝牙耳机也可以发起建链请求,但做数据通讯的蓝牙模块一般不发起呼叫。链路建立成功后,主从两端之间即可进行双向的数据或语音通讯。在通信状态下,主端和从端设备都可以发起断链,断开蓝牙链路。
蓝牙一对一的串口数据传输应用
蓝牙数据传输应用中,一对一串口数据通讯是最常见的应用之一,蓝牙设备在出厂前即提前设好两个蓝牙设备之间的配对信息,主端预存有从端设备的PIN码、地址等,两端设备加电即自动建链,透明串口传输,无需外围电路干预。一对一应用中从端设备可以设为两种类型,一是静默状态,即只能与指定的主端通信,不被别的蓝牙设备查找;二是开发状态,既可被指定主端查找,也可以被别的蓝牙设备查找建链。
四.Android与BLE
1.关键概念:
Generic Attribute Profile (GATT)
通过BLE连接,读写属性类小数据的Profile通用规范。现在所有的BLE应用Profile都是基于GATT的。
Attribute Protocol (ATT)
GATT是基于ATTProtocol的。ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据。每个属性都有一个唯一的UUID,属性将以characteristics&and&services的形式传输。
Characteristic
Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。
Descriptor
对Characteristic的描述,例如范围、计量单位等。
Characteristic的集合。例如一个service叫做“Heart Rate Monitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heart ratemeasurement&的Characteristic。一个手环可能
2.角色和职责:
Android设备与BLE设备交互有两组角色:
中心设备和外围设备(Central vs. peripheral);
GATT server vs. GATT client.
Central vs. peripheral:
中心设备和外围设备的概念针对的是BLE连接本身。Central角色负责scan advertisement。而peripheral角色负责make advertisement。
GATT server vs. GATT client:
这两种角色取决于BLE连接成功后,两个设备间通信的方式。
举例说明:
现 有一个活动追踪的BLE设备和一个支持BLE的Android设备。Android设备支持Central角色,而BLE设备支持peripheral角色。创建一个BLE连接需要这两个角色都存在,都仅支持Central角色或者都仅支持peripheral角色则无法建立连接。
当 连接建立后,它们之间就需要传输GATT数据。谁做server,谁做client,则取决于具体数据传输的情况。例如,如果活动追踪的BLE设备需要向 Android设备传输sensor数据,则活动追踪器自然成为了server端;而如果活动追踪器需要从Android设备获取更新信息,则 Android设备作为server端可能更合适。
3权限及feature:
和经典蓝牙一样,应用使用蓝牙,需要声明BLUETOOTH权限,如果需要扫描设备或者操作蓝牙设置,则还需要BLUETOOTH_ADMIN权限:
&uses-permissionandroid:name=&android.permission.BLUETOOTH&/&&uses-permission android:name=&android.permission.BLUETOOTH_ADMIN&/&
除了蓝牙权限外,如果需要BLE feature则还需要声明uses-feature:
&uses-featureandroid:name=&android.hardware.bluetooth_le&android:required=&true&/&
按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备均可正常安装运行,需要在代码运行时判断设备是否支持BLE feature:
// Use this check to determine whether BLE is supportedon the device. Then
// you can selectively disable BLE-related features.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){
Toast.makeText(this, R.string.ble_not_supported,Toast.LENGTH_SHORT).show();
4、启动蓝牙:
在使用蓝牙BLE之前,需要确认Android设备是否支持BLE feature(required为false时),另外要需要确认蓝牙是否打开。
如果发现不支持BLE,则不能使用BLE相关的功能。如果支持BLE,但是蓝牙没打开,则需要打开蓝牙。
打开蓝牙的步骤:
1、获取BluetoothAdapter
BluetoothAdapter是Android系统中所有蓝牙操作都需要的,它对应本地Android设备的蓝牙模块,在整个系统中BluetoothAdapter是单例的。当你获取到它的示例之后,就能进行相关的蓝牙操作了。
获取BluetoothAdapter代码示例如下:
// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
注:这里通过getSystemService获取BluetoothManager,再通过BluetoothManager获取BluetoothAdapter。BluetoothManager在Android4.3以上支持(API level 18)。
2、判断是否支持蓝牙,并打开蓝牙
获取到BluetoothAdapter之后,还需要判断是否支持蓝牙,以及蓝牙是否打开。
如果没打开,需要让用户打开蓝牙:
private BluetoothAdapter mBluetoothA
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
5、搜索BLE设备:
通过调用BluetoothAdapter的
搜索BLE设备。调用此方法时需要传入&
因此你需要实现
接口,BLE设备的搜索结果将通过这个callback返回。
由于搜索需要尽量减少功耗,因此在实际使用时需要注意:
1、当找到对应的设备后,立即停止扫描;
2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停扫描,消耗电量。
搜索的示例代码如下:
* Activity for scanning and displaying available BLE devices.
public class DeviceScanActivity extends ListActivity {
private BluetoothAdapter mBluetoothA
private boolean mS
private Handler mH
// Stops scanning after 10 seconds.
private static final long SCAN_PERIOD = 10000;
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
public void run() {
mScanning =
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}, SCAN_PERIOD);
mScanning =
mBluetoothAdapter.startLeScan(mLeScanCallback);
mScanning =
mBluetoothAdapter.stopLeScan(mLeScanCallback);
如果你只需要搜索指定UUID的外设,你可以调用
其中UUID数组指定你的应用程序所支持的GATT Services的UUID。
的实现示例如下:
private LeDeviceListAdapter mLeDeviceListA
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
runOnUiThread(new Runnable() {
public void run() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。
6、连接GATTServer:
两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。
连接GATT Server,你需要调用BluetoothDevice的
方法。此函数带三个参数:Context、autoConnect(boolean)和
对象。调用示例:
mBluetoothGatt = device.connectGatt(this, false,mGattCallback);
函数成功,返回
对象,它是GATT profile的封装。通过这个对象,我们就能进行GATT Client端的相关操作。
用于传递一些连接状态及结果。
BluetoothGatt常规用到的几个操作示例:
connect() :连接远程设备。
discoverServices() : 搜索连接设备所支持的service。
disconnect():断开与远程设备的GATT连接。
close():关闭GATTClient端。
readCharacteristic(characteristic) :读取指定的characteristic。
setCharacteristicNotification(characteristic,&enabled):设置当指定characteristic值变化时,发出通知。
getServices()&:获取远程设备所支持的services。
1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。
2、 一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调函数中返回。例如 discoverServices与onServicesDiscovered回调,readCharacteristic与 onCharacteristicRead回调,setCharacteristicNotification与onCharacteristicChanged回调等。
http://blog.csdn.net/mov2012/article/details/
百度文档:
BLE入门教程.pdf
BLE_和经典蓝牙Android编程说明.pdf
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示CC2540&-&BLE4.0蓝牙center与peripheral建立连接绑定过程
蓝牙主机从机建立连接绑定过程
center与simplePeripheral建立连接过程
center首先进行osal_init_system()初始化各个任务,SimpleBLECentral_Init-&osal_set_event( simpleBLETaskId,
START_DEVICE_EVT );进入SimpleBLECentral_ProcessEvent()
GAPCentralRole_StartDevice( (gapCentralRoleCB_t *)
&simpleBLERoleCB );//当初始化完成,会发送 GAP_DEVICE_INIT_DONE_EVENT由于注册了simpleBLERoleCB函数,因此发送的event由simpleBLERoleCB函数接收static
void simpleBLECentralEventCB(
gapCentralRoleEvent_t *pEvent )此时pEvent-&gap.opcode =GAP_DEVICE_INIT_DONE_EVENT,相应信息存储于pEvent中
gapEventHdr_t&&&&&&&&&&&&
&&&&&&&&&&&&&&&
//!& GAP_MSG_EVENT and status.
& gapDeviceInitDoneEvent_t&
initD&&&&&&&&&&
//!& GAP initialization done.
gapDeviceInfoEvent_t&&&&&
deviceI&&&&&&&&
//!& Discovery device information event structure.
gapDevDiscEvent_t&&&&&&&&
discC&&&&&&&&&&
//!& Discovery complete event structure.
gapEstLinkReqEvent_t&&&&&
linkC&&&&&&&&&&
//!& Link complete event structure.
gapLinkUpdateEvent_t&&&&&
linkU&&&&&&&&
//!& Link update event structure.
gapTerminateLinkEvent_t&&
linkT&&&&&
//!& Link terminated event structure.
gapCentralRoleEvent_t;
联合体,只有deviceInfo里面的数据是正确的
& osal_event_hdr_t&
&&&&&&&&&&&&&
//!& GAP_MSG_EVENT and status
&&&&&&&&&&&&&&&&&&&&&&
GAP_DEVICE_INIT_DONE_EVENT
devAddr[B_ADDR_LEN];&&&&&&&&&
//!& Device's BD_ADDR
dataPktL&&&&&&&&&&&&&&&&&
HC_LE_Data_Packet_Length
numDataP&&&&&&&&&&&&&&&&&
HC_Total_Num_LE_Data_Packets
gapDeviceInitDoneEvent_t;
能获得如设备地址等信息
设备初始化完成
通过串口发送'1'触发设备发现
进行设备扫描
GAP_DEVICE_INFO_EVENT&&&&&&&&&&&&&&&&
0x0D //!& Sent during the Device Discovery Process when
a device is discovered.
GAP_DEVICE_DISCOVERY_EVENT
&&&&&&&&&&&0x01
//!& Sent when the Device Discovery Process is complete.
当发现一个设备时,触发一个设备info事件同样是在simpleBLECentralEventCB处理此时pEvent改变为deviceInfo可以获得广告设备的类型,地址。rssi强度,还有广告数据,内容如下。
& osal_event_hdr_t&
GAP_MSG_EVENT and status
&&&&&&&&&&&&
//!& GAP_DEVICE_INFO_EVENT
eventT&&&&&&&&&
//!& Advertisement Type: @ref GAP_ADVERTISEMENT_TYPE_DEFINES
addrT&&&&&&&&&&
//!& address type: @ref GAP_ADDR_TYPE_DEFINES
addr[B_ADDR_LEN];&& //!&
Address of the advertisement or SCAN_RSP
&&&&&&&&&&&&&&&
//!& Advertisement or SCAN_RSP RSSI
dataL&&&&&&&&&&&
//!& Length (in bytes) of the data field (evtData)
*pEvtD&&&&&&&&&
//!& Data field of advertisement or SCAN_RSP
gapDeviceInfoEvent_t;
center代码是通过设备服务器的uuid来查找设备,一旦找到相应的设备,将设备加入
设备表simpleBLEDevList[]中simpleBLEScanRes扫描到的个数自加一。
//!& Indicates advertising event type used by the advertiser:
GAP_ADVERTISEMENT_TYPE_DEFINES
addrT&&&&&&&&
//!& Address Type: @ref GAP_ADDR_TYPE_DEFINES
& uint8 addr[B_ADDR_LEN]; //!& Device's
gapDevRec_t;
设备表的结构体
addrType有:
&&&&&&&&ADDRTYPE_PUBLIC&&
&&&&&&&&&Use
the BD_ADDR.
&&&&&&&&ADDRTYPE_STATIC&&
&&&&&&&&&Static
&&&&&&&&ADDRTYPE_PRIVATE_NONRESOLVE&&
&&&&&&&&&Generate
Non-Resolvable Private Address.
&&&&&&&&ADDRTYPE_PRIVATE_RESOLVE&&
&&&&&&&&&Generate
Resolvable Private Address.
GAP_DEVICE_INFO_EVENT:
if ( DEFAULT_DEV_DISC_BY_SVC_UUID == TRUE )&
if ( simpleBLEFindSvcUuid( SIMPLEPROFILE_SERV_UUID,
//通过uuid找到的设备
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
pEvent-&deviceInfo.pEvtData,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
pEvent-&deviceInfo.dataLen ) )
HalUARTWrite(0,"info\n",sizeof("info\n"));//dataLen&
数据长度&&&
pEvtData 数据
&&&&&&&&&&&
simpleBLEAddDeviceInfo( pEvent-&deviceInfo.addr,
pEvent-&deviceInfo.addrType );
此时已经获得了扫描到的设备个数,以及设备地址,还有广告内容等信息。
通过串口发送‘3’来 建立连接
建立连接:
taskID;&&&&&&&&&&&&&&
//!& Requesting App/Profile's Task ID
highDutyC&&&&&&&
//!& TRUE to high duty cycle scan, FALSE if not.
whiteL&&&&&&&&&&&
//!& Determines use of the white list: @ref
GAP_WHITELIST_DEFINES
addrTypeP&&&&&&&&
//!& Address type of the advertiser: @ref
GAP_ADDR_TYPE_DEFINES
& uint8 peerAddr[B_ADDR_LEN]; //!&
Advertiser's address
gapEstLinkReq_t;
调用 GAP_EstablishLinkReq(gapEstLinkReq_t
);完成后发送GAP_LINK_ESTABLISHED_EVENT,由simpleBLECentralEventCB(
gapCentralRoleEvent_t *pEvent )处理
GAP_LINK_ESTABLISHED_EVENT&&&&&&&&&&&
0x05 //!& Sent when the Establish Link Request is complete.
&用此时pEvent变为:
& osal_event_hdr_t&
//!& GAP_MSG_EVENT and status
&&&&&&&&&&&&&
GAP_LINK_ESTABLISHED_EVENT
devAddrT&&&&&&&&
//!& Device address type: @ref GAP_ADDR_TYPE_DEFINES
& uint8 devAddr[B_ADDR_LEN]; //!& Device
address of link
connectionH&& //!&
Connection Handle from controller used to ref the device
connI&&&&&&
//!& Connection Interval
connL&&&&&&&
//!& Conenction Latency
connT&&&&&&&
//!& Connection Timeout
clockA&&&&&&
//!& Clock Accuracy
gapEstLinkReqEvent_t;
可以得到设备地址。连接的handle连接完成
连接过程中发送START_DISCOVERY_EVT事件进行服务器发现。就可以对相应的handle,characteristic value进行读写操作,或者用于向主机,从机发送数据。
获得服务器相应特性值的handle有三种方法:
1.通过主服务的uuid(uuid已知)来查找。
GATT_DiscPrimaryServiceByUUID&&&&&&&&(uint16
&&&&&&&&connHandle,//
连接的handle
&&&&&&&&pValue,&
&&&&&&&&len,&
// uuid的长度
&&&&&&&&taskId&
//&&&&&&&&
接收消息的任务ID
发送 ATT_FIND_BY_TYPE_VALUE_RSP 或者
ATT_ERROR_RSP由相应任务接收处理
static void simpleBLEGATTDiscoveryEvent(
gattMsgEvent_t *pMsg )通过此函数进行通过UUID来查找相应的Handle进行对特性值的相关操作。
2.查找所有的服务
GATT_DiscAllPrimaryServices&&&&&&&&(uint16
&&&&&&&&connHandle,//连接handle
&&&&&&&&taskId&&&&&&&&
//接收消息的任务ID
)&&&&&&&&&&&&&&&&&&&&&&&&
&osal_start_timerEx( simpleBLETaskId,
START_DISCOVERY_EVT, DEFAULT_SVC_DISCOVERY_DELAY );
到此连接完成。
3、GATT_DiscAllCharDescs()
这个接口,这个能自动把所有service
查找完,应该能发现你要的UUID。
终止连接:
GAP_TerminateLinkReq(任务id,handle)发送断开连接event
GAP_LINK_TERMINATED_EVENT&&&
又一次调用& simpleBLECentralEventCB(
gapCentralRoleEvent_t *pEvent )&
& osal_event_hdr_t&
//!& GAP_MSG_EVENT and status
&&&&&&&&&&&&&
GAP_LINK_ESTABLISHED_EVENT
devAddrT&&&&&&&&
//!& Device address type: @ref GAP_ADDR_TYPE_DEFINES
& uint8 devAddr[B_ADDR_LEN]; //!& Device
address of link
connectionH&& //!&
Connection Handle from controller used to ref the device
connI&&&&&&
//!& Connection Interval
connL&&&&&&&
//!& Conenction Latency
connT&&&&&&&
//!& Connection Timeout
clockA&&&&&&
//!& Clock Accuracy
gapEstLinkReqEvent_t;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。蓝牙BLE权威教程_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
蓝牙BLE权威教程
上传于||文档简介
&&B​L​E​权​威​教​程​ ​ ​ ​蓝​牙.​0
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩146页未读,继续阅读
你可能喜欢BLE4.0&Client发送数据给Server
发送数据给Server
使用的器件:USBdongle+MiniDK + usb转串口
功能:通过串口发送数据给USBDongle,触发USBDongle发送数据给MiniDK
使用例程:SimpleBLEPeripheral与,SimpleBLECentral
在SimpleBLEPeripheral中添加自定义特性值6
修改simpleGATTprofile.c,simpleGATTprofile.h
添加可读写的20个字节的SIMPLEPROFILE_CHAR6
在center中,一旦与simplePeripheral建立连接,就可获取到所有ServerUUID,并能得到相应
特性值的Handle,
获取特性值Handle
GATT_WriteCharValue&&&&&&&&(&&&&&&&&uint16
&&&&&&&&connHandle,
attWriteReq_t *
&&&&&&&&pReq,
&&&&&&&&taskId&&&&&&&&
)&&&&&&&&&&&&&&&&&&&&&&&&
只有当Client端(USBDongle)知道Server端(MiniDK)相应characteristic value 的Handle.
并且已经连接上才能写入成功
Parameters:
connHandle
connection to use
pointer to request to be sent
task to be notified of response
Request was sent successfully.
INVALIDPARAMETER: Invalid connection handle or request field.
MSG_BUFFER_NOT_AVAIL: No HCI buffer is available.
bleNotConnected: Connection is down.
blePending: A response is pending with this server.
bleMemAllocError: Memory allocation error occurred.
bleTimeout: Previous transaction timed out.
&&&&&&&&&&&&&&
//!& 要写入的characteristic value 的Handle
&&&&&&&&&&&&&&&&&&
//!& 写入数据的长度
& uint8 value[ATT_MTU_SIZE-3];
//!&&/span&数据内容
&&&&&&&&&&&&&&&&&&
//!& Authentication Signature status (not included (0), valid
(1), invalid (2))
&&&&&&&&&&&&&&&&&&
//!& Command Flag(暂不知这两个参数用途)
attWriteReq_t;
-----------------------------------------------------------------------------------------------------------------
uint8 state = 0;
uint8 ch[] =
"abcdef1234";&&
//最大20个字节。
&attWriteReq_
&req.handle =
0x0035;&&&&&&&&&&&
//特性值6handle
req.len = 19;
osal_memcpy(req.value,ch,19);
req.sig = 0;
req.cmd = 0;
GATT_WriteCharValue(simpleBLEConnHandle,&req,simpleBLETaskId)
if( state == SUCCESS)&
--------------------------------------------------------------------------------------------------------------------
在center中通过串口控制来向从机发送数据,
由于simpleperipheral中的characteristic中的内容改变了,会触发相应的CallBack函数
在simpleperipheral中
static void
simpleProfileChangeCB( uint8 paramID )为charasteristic值改变的回调函数paramID为
charasteristic的uuid
通过switch(paramID)查找到对应的characteristic通过
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR6, newChar
);&&&&&&&&&&&&&&&&&&
就能得到所接收到的数据。不过数据最大长度只有20个字节。
& case SIMPLEPROFILE_CHAR6:
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR6, newChar );
SimpleProfile_GetParameter直接将char6的内容复制给了newChar,这样就得到了center发送过来的数据了。
& case SIMPLEPROFILE_CHAR6:
VOID osal_memcpy( value, simpleProfileChar6,
SIMPLEPROFILE_CHAR6_LEN );
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 ios ble peripheral 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信