概念篇
什么是藍(lán)牙
藍(lán)牙(Bluetooth?):是一種無(wú)線技術(shù)標(biāo)準(zhǔn)(短距離無(wú)線通信技術(shù)),可實(shí)現(xiàn)固定設(shè)備、移動(dòng)設(shè)備和樓宇個(gè)人域網(wǎng)之間的短距離數(shù)據(jù)交換(使用2.4—2.485GHz的ISM波段的UHF無(wú)線電波)。藍(lán)牙技術(shù)最初由電信巨頭愛(ài)立信公司于1994年創(chuàng)制,當(dāng)時(shí)是作為RS232數(shù)據(jù)線的替代方案。藍(lán)牙可連接多個(gè)設(shè)備,克服了數(shù)據(jù)同步的難題。如今藍(lán)牙由藍(lán)牙技術(shù)聯(lián)盟(Bluetooth Special Interest Group,簡(jiǎn)稱SIG)管理。
藍(lán)牙技術(shù)聯(lián)盟
藍(lán)牙技術(shù)聯(lián)盟是一個(gè)以制定藍(lán)牙規(guī)范,以推動(dòng)藍(lán)牙技術(shù)為宗旨的跨國(guó)組織。它擁有藍(lán)牙的商標(biāo),負(fù)責(zé)認(rèn)證制造廠商,授權(quán)他們使用藍(lán)牙技術(shù)與藍(lán)牙標(biāo)志,但是它本身不負(fù)責(zé)藍(lán)牙裝置的設(shè)計(jì)、生產(chǎn)及販?zhǔn)邸?/p>
Bluetooth SIG的發(fā)起公司是Agere、愛(ài)立信、IBM、英特爾、微軟、摩托羅拉、諾基亞和東芝。2006年10月13日,Bluetooth SIG(藍(lán)牙技術(shù)聯(lián)盟)宣布聯(lián)想公司取代IBM在該組織中的創(chuàng)始成員位置,并立即生效。通過(guò)成為創(chuàng)始成員,聯(lián)想將與其他業(yè)界領(lǐng)導(dǎo)廠商杰爾系統(tǒng)公司、愛(ài)立信公司、英特爾公司、微軟公司、摩托羅拉公司、諾基亞公司和東芝公司一樣擁有藍(lán)牙技術(shù)聯(lián)盟董事會(huì)中的一席,并積極推動(dòng)藍(lán)牙標(biāo)準(zhǔn)的發(fā)展。除了創(chuàng)始成員以外,Bluetooth SIG還包括200多家聯(lián)盟成員公司以及約6000家應(yīng)用成員企業(yè)。而企業(yè)只要使用“藍(lán)牙(Bluetooth)”相關(guān)商標(biāo)在市場(chǎng)上銷售產(chǎn)品,都必須向藍(lán)牙技術(shù)聯(lián)盟交納商標(biāo)使用費(fèi)和產(chǎn)品認(rèn)證費(fèi)用。
藍(lán)牙4.x時(shí)代
藍(lán)牙4.0是2012年最新藍(lán)牙版本,是3.0的升級(jí)版本;較3.0版本更省電、成本低、3毫秒低延遲、超長(zhǎng)有效連接距離、AES-128加密等;通常用在藍(lán)牙耳機(jī)、藍(lán)牙音箱等設(shè)備上。
藍(lán)牙技術(shù)聯(lián)盟(Bluetooth SIG)2010年7月7日宣布,正式采納藍(lán)牙4.0核心規(guī)范(Bluetooth Core Specification Version 4.0 ),并啟動(dòng)對(duì)應(yīng)的認(rèn)證計(jì)劃。會(huì)員廠商可以提交其產(chǎn)品進(jìn)行測(cè)試,通過(guò)后將獲得藍(lán)牙4.0標(biāo)準(zhǔn)認(rèn)證。 該技術(shù)擁有極低的運(yùn)行和待機(jī)功耗,使用一粒紐扣電池甚至可連續(xù)工作數(shù)年之久。
2014年12月,藍(lán)牙技術(shù)聯(lián)盟公布藍(lán)牙4.2標(biāo)準(zhǔn)。
市場(chǎng)上最主要用的還是4.2(藍(lán)牙4.2發(fā)布于2014年12月2日) 。
藍(lán)牙5.x時(shí)代
2016年6月16日,藍(lán)牙技術(shù)聯(lián)盟在倫敦發(fā)布全新的藍(lán)牙5.0標(biāo)準(zhǔn)。
2019年1月29日,藍(lán)牙技術(shù)聯(lián)盟(SIG)宣布藍(lán)牙5.1正式公布。
藍(lán)牙5.0有哪些提升?
1:4倍信號(hào)范圍
2:2倍連接速度(新版本的藍(lán)牙傳輸速度上限為24Mbps)
3:藍(lán)牙廣播8倍數(shù)據(jù)傳輸
這意味著:
藍(lán)牙的信號(hào)傳輸距離能夠覆蓋整戶公寓,甚至是整棟小型樓房,而不再是以往的一個(gè)房間。
更快的傳輸速度,使反應(yīng)更快、性能更高的藍(lán)牙設(shè)備成為可能。
更穩(wěn)定可靠的藍(lán)牙連接。
更好的商用藍(lán)牙前景。大幅增強(qiáng)的藍(lán)牙廣播,使基于藍(lán)牙信標(biāo)的物聯(lián)網(wǎng)應(yīng)用更加強(qiáng)大,比如某商店向店內(nèi)消費(fèi)者的手機(jī)推送廣告和優(yōu)惠券。
藍(lán)牙外設(shè)
BLE:bluetouch low energy,藍(lán)牙4.0設(shè)備因?yàn)榈凸?,所有也叫作BLE。蘋果在iphone4s及之后的手機(jī)型號(hào)開(kāi)始支持藍(lán)牙4.0,這也是最常見(jiàn)的藍(lán)牙設(shè)備。低于藍(lán)牙4.0協(xié)議的設(shè)備需要進(jìn)行MFI認(rèn)證,
什么是MFi認(rèn)證?
蘋果MFi認(rèn)證,是蘋果公司(Apple Inc.)對(duì)其授權(quán)配件廠商生產(chǎn)的外置配件的一種標(biāo)識(shí)使用許可,是apple公司 “Made for iOS”的英文縮寫(xiě)。
常用庫(kù)
iOS中提供了4個(gè)框架用于實(shí)現(xiàn)藍(lán)牙連接。
1.GameKit.framework(用法簡(jiǎn)單)
只能用于iOS設(shè)備之間的同個(gè)應(yīng)用內(nèi)連接,多用于游戲(eg:棋牌類),從iOS7開(kāi)始過(guò)期
2.MultipeerConnectivity.framework(代替1)
只能用于iOS設(shè)備之間的連接,從iOS7開(kāi)始引入,主要用于非聯(lián)網(wǎng)狀態(tài)下,通過(guò)wifi或者藍(lán)牙進(jìn)行文件共享(僅限于沙盒的文件),多用于附近無(wú)網(wǎng)聊天
3.ExternalAccessory.framework(MFi)
可用于第三方藍(lán)牙設(shè)備交互,但是藍(lán)牙設(shè)備必須經(jīng)過(guò)蘋果MFi認(rèn)證(國(guó)內(nèi)很少)
4.CoreBluetooth.framework(常用 Apple推行藍(lán)牙的核心)
可用于第三方藍(lán)牙設(shè)備交互,必須要支持藍(lán)牙4.0
硬件至少是4s,系統(tǒng)至少是iOS6 (現(xiàn)iPhoneX 藍(lán)牙5.0)
藍(lán)牙4.0以低功耗著稱,一般也叫BLE(Bluetooth Low Energy)
目前應(yīng)用比較多的案例:運(yùn)動(dòng)手環(huán),嵌入式設(shè)備,智能家居
我們公司對(duì)接的外設(shè)比較多 心率計(jì)、踏頻、碼表等運(yùn)動(dòng)藍(lán)牙設(shè)備
1.CoreBluetooth框架的核心其實(shí)是兩個(gè)東西,peripheral和central, 能了解成外設(shè)和中心,就是你的蘋果手機(jī)就是中心,外部藍(lán)牙稱為外設(shè)。
2.服務(wù)和特征(service characteristic):簡(jiǎn)而言之,外部藍(lán)牙中它有若干個(gè)服務(wù)service(服務(wù)你能了解為藍(lán)牙所擁有的可以力),而每個(gè)服務(wù)service下?lián)碛腥舾蓚€(gè)特征characteristic(特征你能了解為解釋這個(gè)服務(wù)的屬性)。
3.Descriptor(形容)使用來(lái)形容characteristic變量的屬性。例如,一個(gè)descriptor能規(guī)定一個(gè)可讀的形容,或者者一個(gè)characteristic變量可接受的范圍,或者者一個(gè)characteristic變量特定的單位。
蘋果自身有一個(gè)操作藍(lán)牙的庫(kù)CoreBluetooth.framework,這個(gè)是大多數(shù)人員進(jìn)行藍(lán)牙開(kāi)發(fā)的首選框架,除此之外目前github還有一個(gè)比較流行的對(duì)原生框架進(jìn)行封裝的三方庫(kù)BabyBluetooth,它的機(jī)制是將CoreBluetooth中眾多的delegate寫(xiě)成了block方法,有興趣的同學(xué)可以了解下。下面主要介紹的是原生藍(lán)牙庫(kù)的知識(shí)。
電腦、Pad、手機(jī)作為中心,心跳監(jiān)聽(tīng)器作為外設(shè),這種中心外設(shè)模式是最常見(jiàn)的。簡(jiǎn)單理解就是,發(fā)起連接的是中心設(shè)備(Central),被連接的是外圍設(shè)備(Peripheral),對(duì)應(yīng)傳統(tǒng)的客戶機(jī)-服務(wù)器體系結(jié)構(gòu)。Central能夠掃描偵聽(tīng)到,正在播放廣告包的外設(shè)。
工具 --BabyBluetooth
BabyBluetooth是一個(gè)最簡(jiǎn)單易用的藍(lán)牙庫(kù),基于CoreBluetooth的封裝,并兼容ios和Mac osx。
BabyBluetooth的優(yōu)點(diǎn):
1:基于原生CoreBluetooth框架封裝的輕量級(jí)的開(kāi)源庫(kù),可以幫你更簡(jiǎn)單地使用CoreBluetooth API。
2:CoreBluetooth所有方法都是通過(guò)委托完成,代碼冗余且順序凌亂。BabyBluetooth使用block方法,可以重新按照功能和順序組織代碼,并提供許多方法減少藍(lán)牙開(kāi)發(fā)過(guò)程中的代碼量。
3:鏈?zhǔn)椒椒w,代碼更簡(jiǎn)潔、優(yōu)雅。
4:通過(guò)channel切換區(qū)分委托調(diào)用,并方便切換
5:便利的工具方法
6:完善的文檔,且項(xiàng)目處于活躍狀態(tài),不斷的更新中
7:github上star最多的純Bluetooch類庫(kù)(非PhoneGap和SensorTag項(xiàng)目)
備注:具體參考 https://github.com/coolnameismy/BabyBluetooth
藍(lán)牙連接的主要步驟
1、創(chuàng)建一個(gè)CBCentralManager實(shí)例來(lái)進(jìn)行藍(lán)牙管理;
2、搜索掃描外圍設(shè)備;
3、連接外圍設(shè)備;
4、獲得外圍設(shè)備的服務(wù);
5、獲得服務(wù)的特征;
6、從外圍設(shè)備讀取數(shù)據(jù);
7、給外圍設(shè)備發(fā)送(寫(xiě)入)數(shù)據(jù)。
服務(wù)與特征
外設(shè)可以包含一個(gè)或多個(gè)服務(wù)(CBService),服務(wù)是用于實(shí)現(xiàn)裝置的功能或特征數(shù)據(jù)相關(guān)聯(lián)的行為集合。 而每個(gè)服務(wù)又對(duì)應(yīng)多個(gè)特征(CBCharacteristic),特征提供外設(shè)服務(wù)進(jìn)一步的細(xì)節(jié),外設(shè),服務(wù),特征對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)如下所示
iOS藍(lán)牙中的進(jìn)制轉(zhuǎn)換,數(shù)據(jù)格式轉(zhuǎn)換
https://www.cnblogs.com/W-Kr/p/5398490.html
前言
現(xiàn)階段智能家居,還是比較火熱門的話題。那么一部分智能家居離不開(kāi)移動(dòng)端。作為中間媒介,藍(lán)牙的開(kāi)發(fā)也是必要掌握的技能之一。藍(lán)牙開(kāi)發(fā)很重要的是藍(lán)牙設(shè)備的協(xié)議掌握。如果沒(méi)有掌握協(xié)議,那么你就無(wú)法解鎖更多新姿勢(shì)。
設(shè)備--智能鎖
我們今天要介紹的設(shè)備是一個(gè)藍(lán)牙鎖。在開(kāi)發(fā)藍(lán)牙鎖之前首先我們要掌握這個(gè)一個(gè)鎖的基本數(shù)據(jù)。下載一個(gè)藍(lán)牙助手,打開(kāi)藍(lán)牙助手,找到我們的智能設(shè)備--藍(lán)牙鎖。(該鎖名稱--LOCKSUS).點(diǎn)擊鏈接進(jìn)入詳情頁(yè)面入下圖:
突然一看,其實(shí)是沒(méi)有任何頭緒。但是有一個(gè)是可以知道的@“LOCKSUS”。這個(gè)是鎖的名字。
下面兩個(gè)屬性分寫(xiě)寫(xiě)著:1:寫(xiě)無(wú)回復(fù)和通知兩個(gè)特征。
以上了解那么多就可以了,然后繼續(xù)看協(xié)議。(由于協(xié)議不能隨便展示,所以此處請(qǐng)看我的pdf文檔)。
協(xié)議
Length (2 Bytes) + command code (1 Bytes) Data(N Bytes)+CheckSum(2 Bytes)
Length = sizeof(Command code + Data)
CheckSum = sum of (Command Code + Data)
例如,如下命令
Req: length(2) | REQ_BIND (1) | Key(6) | CS(2).
Command 為 REQ_BIND (1) Data為 Key(6)
REQ_BIND (1) 0xc6 Key(6):123456
備注:被請(qǐng)求一方,收到Request指令后,都要ack一個(gè)對(duì)應(yīng)指令, 所有命令都以Req/Ack的 模式成對(duì)出現(xiàn)。
流程圖
工具 --BabyBluetooth
BabyBluetooth按照按照說(shuō)明使用。
- (void)viewDidLoad {
[super viewDidLoad];
[self setUpView];
//初始化BabyBluetooth 藍(lán)牙庫(kù)
self.babyBluetooth = [BabyBluetooth shareBabyBluetooth];
//設(shè)置藍(lán)牙委托
[self babyDelegate];
}
第二步,在babyDelegate方法中先試下如下代理。
//過(guò)濾器
//設(shè)置查找設(shè)備的過(guò)濾器
[self.babyBluetooth setFilterOnDiscoverPeripherals:^BOOL(NSString *peripheralName, NSDictionary *advertisementData, NSNumber *RSSI) {
//最常用的場(chǎng)景是查找某一個(gè)前綴開(kāi)頭的設(shè)備 most common usage is discover for peripheral that name has common prefix
if ([peripheralName hasPrefix:@"LOCKSUS"] ) {
return YES;
}
return NO;
}];
該代理是過(guò)濾功能,防止中心設(shè)備搜索過(guò)多的非目標(biāo)設(shè)備。設(shè)置后可以指定查找名叫@“LOCKSUS”的設(shè)備。
//設(shè)置連接的設(shè)備的過(guò)濾器
__block BOOL isFirst = YES;
[self.babyBluetooth setFilterOnConnectToPeripherals:^BOOL(NSString *peripheralName, NSDictionary *advertisementData, NSNumber *RSSI) {
//這里的規(guī)則是:連接第一個(gè)AAA打頭的設(shè)備
if(isFirst && [peripheralName hasPrefix:@"LOCKSUS"]){
isFirst = NO;
return YES;
}
return NO;
}];
該代理是過(guò)濾功能,防止中心設(shè)備連接過(guò)多的非目標(biāo)設(shè)備。設(shè)置后可以指定連接名叫@“LOCKSUS”的設(shè)備。
//藍(lán)牙網(wǎng)關(guān)初始化和委托方法設(shè)置
-(void)babyDelegate{
__weak typeof(&*self) weakSelf= self;
//設(shè)置掃描到設(shè)備的委托
[self.babyBluetooth setBlockOnDiscoverToPeripherals:^(CBCentralManager *central, CBPeripheral *peripheral, NSDictionary *advertisementData, NSNumber *RSSI) {
if ([peripheral.name isEqualToString:@"LOCKSUS"]) {
NSLog(@"搜索到了設(shè)備:%@",peripheral.name);
NSString *bleName = [advertisementData objectForKey:@"kCBAdvDataLocalName"];
weakSelf.macAddress = [NSString convertDataToHexStr:advertisementData[@"kCBAdvDataManufacturerData"]];
NSString *oriData = [TestViewController getLockOriData:advertisementData[@"kCBAdvDataManufacturerData"]];
weakSelf.peripheral = peripheral;
NSLog(@"掃描成功:%@%@%@",weakSelf.peripheral,bleName,oriData);
}
}];
//設(shè)置設(shè)備連接成功的委托
[self.babyBluetooth setBlockOnConnected:^(CBCentralManager *central, CBPeripheral *peripheral) {
NSLog(@"設(shè)備:%@--連接成功",peripheral.name);
[peripheral discoverServices:@[[CBUUID UUIDWithString:UUID_SERVICE]]];
}];
//設(shè)置發(fā)現(xiàn)設(shè)備的Services的委托
[self.babyBluetooth setBlockOnDiscoverServices:^(CBPeripheral *peripheral, NSError *error) {
CBService * __nullable findService = nil;
// 遍歷服務(wù)
// 啟動(dòng)特征掃描
for (CBService *service in peripheral.services){
NSLog(@"搜索到服務(wù):%@",service.UUID.UUIDString);
if ([[service UUID]isEqual:[CBUUID UUIDWithString:UUID_SERVICE]]) {
findService = service;
}
}
//一下代碼是 要目標(biāo)服務(wù)的特征值 不寫(xiě)是不會(huì)觸動(dòng) 獲取特征值的回調(diào)的。(下面一個(gè))
if (findService){
[peripheral discoverCharacteristics:NULL forService:findService];
}
}];
//設(shè)置發(fā)現(xiàn)設(shè)service的Characteristics的委托
[self.babyBluetooth setBlockOnDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
NSLog(@"===service name:%@",service.UUID);
/*
charateristic name is :6E40FF02-B5A3-F393-E0A9-E50E24DCCA9E (可寫(xiě)入屬性)
charateristic name is :6E40FF03-B5A3-F393-E0A9-E50E24DCCA9E (通知屬性)
*/
for (CBCharacteristic *c in service.characteristics) {
NSLog(@"charateristic name is :%@",c.UUID);
//此時(shí)我們是要準(zhǔn)備寫(xiě)入數(shù)據(jù)的,所以要找到相對(duì)應(yīng)的特征值
if ([c.UUID isEqual:[CBUUID UUIDWithString:UUID_USER0_WRITE]]) {
[peripheral readValueForCharacteristic:c];
weakSelf.wChar = c;
[peripheral setNotifyValue:YES forCharacteristic:c];
}else{
weakSelf.ntfChar = c;
[peripheral setNotifyValue:YES forCharacteristic:weakSelf.ntfChar];
}
}
if ([weakSelf.macAddress isEqualToString:@"686f01"]) {
// 已經(jīng)綁定過(guò)了
[[FBluetoothLockManage sharedSingleton] reqMatchBindDevice:peripheral wChar:weakSelf.wChar wPinCode:@"123456"];
}else{
//f00 未綁定
[[FBluetoothLockManage sharedSingleton] reqBindDevice:peripheral wChar:weakSelf.wChar wPinCode:@"123456"];
}
}];
//設(shè)置讀取characteristics的委托
[self.babyBluetooth setBlockOnReadValueForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristics, NSError *error) {
NSLog(@"characteristic name:%@ value is:%@",characteristics.UUID,characteristics.value);
const int8_t *rspData = (const int8_t *)[characteristics.value bytes];
if(rspData == nil){
return;
}
Byte *rspDataByte = (Byte *)[characteristics.value bytes];
NSLog(@"rspDataByte=%s",rspDataByte);
[weakSelf updateDeviceAck2AppRspData:characteristics.value];
}];
//設(shè)置發(fā)現(xiàn)characteristics的descriptors的委托
[self.babyBluetooth setBlockOnDiscoverDescriptorsForCharacteristic:^(CBPeripheral *peripheral, CBCharacteristic *characteristic, NSError *error) {
NSLog(@"===characteristic name:%@",characteristic.service.UUID);
for (CBDescriptor *d in characteristic.descriptors) {
NSLog(@"CBDescriptor name is :%@",d.UUID);
}
}];
//設(shè)置讀取Descriptor的委托
[self.babyBluetooth setBlockOnReadValueForDescriptors:^(CBPeripheral *peripheral, CBDescriptor *descriptor, NSError *error) {
NSLog(@"Descriptor name:%@ value is:%@",descriptor.characteristic.UUID, descriptor.value);
}];
}
-(void)clickScan{
NSLog(@"開(kāi)始掃描外設(shè)");
//設(shè)置委托后直接可以使用,無(wú)需等待CBCentralManagerStatePoweredOn狀態(tài)
self.babyBluetooth.scanForPeripherals().begin();
}
-(void)clickConnect{
if([_peripheral isKindOfClass:[CBPeripheral class]]){
// 開(kāi)始連接外部設(shè)備
self.babyBluetooth.having(self.peripheral).connectToPeripherals().begin();
NSLog(@"開(kāi)始連接....");
}else{
NSLog(@"連接對(duì)象不正確");
}
}
一整套流程走下來(lái),控制臺(tái)輸出log
根據(jù)如下log 更有利于我們理解整個(gè)流程。
2019-12-07 13:40:04.608306+0800 Finance[19739:5874003] 開(kāi)始掃描外設(shè)
2019-12-07 13:40:07.852921+0800 Finance[19739:5874003] str == 686f01
2019-12-07 13:40:07.853291+0800 Finance[19739:5874003] 掃描成功:<CBPeripheral: 0x28014c500, identifier = EADF26D8-D221-D04F-4257-8B483F40D108, name = LOCKSUS, state = disconnected>
2019-12-07 13:40:25.449600+0800 Finance[19739:5874003] 開(kāi)始掃描外設(shè)
2019-12-07 13:40:25.456177+0800 Finance[19739:5874003] str == 686f01
2019-12-07 13:40:25.456404+0800 Finance[19739:5874003] 掃描成功:<CBPeripheral: 0x28014c500, identifier = EADF26D8-D221-D04F-4257-8B483F40D108, name = LOCKSUS, state = disconnected>
2019-12-07 13:40:25.918225+0800 Finance[19739:5874003] 開(kāi)始連接....
2019-12-07 13:40:26.289438+0800 Finance[19739:5874003] 外設(shè)連接成功
2019-12-07 13:40:26.732115+0800 Finance[19739:5874003] 發(fā)現(xiàn)外設(shè)服務(wù)
2019-12-07 13:40:26.787383+0800 Finance[19739:5874003] 獲取到特征值
2019-12-07 13:40:26.789573+0800 Finance[19739:5874003] NSData dec = {length = 6, bytes = 0x010203040506}
2019-12-07 13:40:26.790020+0800 Finance[19739:5874003] dtCrc : 81f67724
2019-12-07 13:40:26.790555+0800 Finance[19739:5874003] 茭白綁定數(shù)據(jù) 上鎖密碼是{length = 6, bytes = 0x2477f6810000}
2019-12-07 13:40:26.790855+0800 Finance[19739:5874003] bind cs : 02d8
2019-12-07 13:40:26.791298+0800 Finance[19739:5874003] bind Data : {length = 11, bytes = 0x0700c62477f6810000d802}
2019-12-07 13:40:26.791720+0800 Finance[19739:5874003] 茭白 數(shù)據(jù) wr 2 bind data:{length = 11, bytes = 0x0700c62477f6810000d802}
2019-12-07 13:40:26.792888+0800 Finance[19739:5874003] NSData dec = {length = 6, bytes = 0x010203040506}
2019-12-07 13:40:26.793177+0800 Finance[19739:5874003] dtCrc : 81f67724
2019-12-07 13:40:26.793416+0800 Finance[19739:5874003] 茭白匹配數(shù)據(jù)--上鎖密碼是{length = 6, bytes = 0x2477f6810000}
2019-12-07 13:40:26.793592+0800 Finance[19739:5874003] bind cs : 02da
2019-12-07 13:40:26.793958+0800 Finance[19739:5874003] bind Data : {length = 11, bytes = 0x0700c82477f6810000da02}
2019-12-07 13:40:26.794274+0800 Finance[19739:5874003] 茭白 數(shù)據(jù) wr 2 bind data:{length = 11, bytes = 0x0700c82477f6810000da02}
2019-12-07 13:40:26.795303+0800 Finance[19739:5874003] 茭白--發(fā)現(xiàn)數(shù)據(jù)改變了
2019-12-07 13:40:26.795687+0800 Finance[19739:5874003] 有值得改變:<CBCharacteristic: 0x281450660, UUID = 6E40FF02-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x4, value = (null), notifying = NO>
2019-12-07 13:40:26.965111+0800 Finance[19739:5874003] 茭白--發(fā)現(xiàn)數(shù)據(jù)改變了
2019-12-07 13:40:26.965622+0800 Finance[19739:5874003] 有值得改變:<CBCharacteristic: 0x2814507e0, UUID = 6E40FF03-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 12, bytes = 0x0200c701c8000200c900c900}, notifying = YES>
2019-12-07 13:40:26.965992+0800 Finance[19739:5874003] -[TestViewController updateDeviceAck2AppRspData:] ackData:{length = 12, bytes = 0x0200c701c8000200c900c900}
2019-12-07 13:40:26.966269+0800 Finance[19739:5874003] 命令成功后回調(diào)==199
2019-12-07 13:40:26.966461+0800 Finance[19739:5874003] 享睿--綁定成功回調(diào)
2019-12-07 13:40:54.245568+0800 Finance[19739:5874169] [] tcp_input [C3.1:3] flags=[R] seq=1483030945, ack=0, win=0 state=LAST_ACK rcv_nxt=1483030945, snd_una=2805171121
2019-12-07 13:40:57.095240+0800 Finance[19739:5874003] NSData dec = {length = 6, bytes = 0x010203040506}
2019-12-07 13:40:57.095590+0800 Finance[19739:5874003] dtCrc : 81f67724
2019-12-07 13:40:57.095845+0800 Finance[19739:5874003] 解鎖密碼是{length = 6, bytes = 0x2477f6810000}
2019-12-07 13:40:57.096118+0800 Finance[19739:5874003] bind cs : 02dc
2019-12-07 13:40:57.096443+0800 Finance[19739:5874003] bind Data : {length = 11, bytes = 0x0700ca2477f6810000dc02}
2019-12-07 13:40:57.096828+0800 Finance[19739:5874003] 茭白 數(shù)據(jù) wr 2 bind data:{length = 11, bytes = 0x0700ca2477f6810000dc02}
2019-12-07 13:40:57.098047+0800 Finance[19739:5874003] 茭白--發(fā)現(xiàn)數(shù)據(jù)改變了
2019-12-07 13:40:57.099416+0800 Finance[19739:5874003] 有值得改變:<CBCharacteristic: 0x281450660, UUID = 6E40FF02-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x4, value = (null), notifying = NO>
2019-12-07 13:40:57.205167+0800 Finance[19739:5874003] 茭白--發(fā)現(xiàn)數(shù)據(jù)改變了
2019-12-07 13:40:57.205615+0800 Finance[19739:5874003] 有值得改變:<CBCharacteristic: 0x2814507e0, UUID = 6E40FF03-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = {length = 6, bytes = 0x0200cb00cb00}, notifying = YES>
2019-12-07 13:40:57.205912+0800 Finance[19739:5874003] -[TestViewController updateDeviceAck2AppRspData:] ackData:{length = 6, bytes = 0x0200cb00cb00}
2019-12-07 13:40:57.206105+0800 Finance[19739:5874003] 命令成功后回調(diào)==203
2019-12-07 13:40:57.206275+0800 Finance[19739:5874003] 享睿--解鎖成功回調(diào)
2019-12-07 13:41:15.120452+0800 Finance[19739:5874003] 開(kāi)始掃描外設(shè)
2019-12-07 13:41:19.278097+0800 Finance[19739:5874003] str ==
2019-12-07 13:41:19.278544+0800 Finance[19739:5874003] 掃描成功:<CBPeripheral: 0x28014c500, identifier = EADF26D8-D221-D04F-4257-8B483F40D108, name = LOCKSUS, state = disconnected>