如何用10分钟完成废手机蓝牙模块diy与手机之间的数据读写交互

通过蓝牙和智能手机进行信息交互需要注意的问题
&&当前位置:&&
> 通过蓝牙和智能手机进行信息交互需要注意的问题
通过蓝牙和智能手机进行信息交互需要注意的问题
发布者:diyadmin 发布时间: 09:49:42 阅读:620次
在过去,在很多的领域,计算机都扮演着数据处理中心的角色。比如锅炉控制,之前都是通过有线,将数据从计算机发送到锅炉的控制中心,然后控制结果再通过有线传回来,再在计算机上进行处理;之前的个人测试血压计,之前都是采用SD卡,或者数据线,把采集的数据传送到计算机上面,再在计算机上面进行分析处理;再如一些仪器仪表,测试结果通过GPIB卡或者USB数据线将测试仪器的数据传送到电脑上。但是今天,事情正在发生非常大的变化,现在的智能手机和平板电脑的处理能力已经非常高,而且非常便于携带,很多行业已经开始把手机、平板电脑作为新的数据处理中心,它已经可以在很多行业可以取代计算机。当计算机更换成智能手机、平板电脑,无线连接取代有线连接,也是一个非常大的趋势。在很多情况,数据处理中心和被管理的设备的数据量不是很大,距离不是很远,这个时候,采用蓝牙来作为传输媒介就非常方便。
在今天的技术环境下,要用蓝牙来完成智能手机、平板电脑和外界设备进行数据传输,还有些注意事项。当前的智能手机,基本有两个系统,iOS系统和Android系统。 iOS系统以手机为例,以iPhone4S为界限,分为iPhone4S之前的手机和iPhone4S(包括iPhone4S)之后的手机,而Android系统的手机,也分为Android4.3之前的手机和Android4.3(包括Android4.3)的手机。
iPhone4S之前的手机,仅仅支持传统蓝牙,需要苹果的MFi授权,获得iAP协议开发权利,方才可以开发和iOS设备进行数据传输的设备。iPhone4S之后(包括iPhone4S),支持低功耗蓝牙技术(BLE),数据传输就有两个传输通路可以选择,其一是走MFi授权下的iAP协议,其二是走低功耗蓝牙的通路。iAP的传输速率要大于BLE的传输速率。
Android的手机,所有的Android手机都可以走SPP来进行数据传输,而且没有任何授权的问题。Android4.3之后(包括Android4.3)的手机,也开始支持低功耗蓝牙技术(BLE)。
苹果的MFi的授权,需要对授权公司的财务状况,产品品质,产品领域,公司规模等各个方面进行审核,审查时间至少6个月,审查非常严格。在成本方面,每一个产品的授权费和加密IC费用一共是1.3美金。
对于大部分公司来讲,在iOS上选择走BLE通路(毕竟iPhone4S之前的手机,现在在市面上的已经不多了,不必考虑支持这部分的手机了)是非常明智的选择。
综合上述因素,既要支持Android系统的设备,又要支持iOS的设备,建议选择低功耗蓝牙(BLE)模块,如果为了顾及Android4.3之前的设备,可以考虑既支持SPP又支持BLE的双模的模组,但是成本就有很大的上升。需要依据项目的实际情况,进行抉择。
无论你今天看到的Beacon的应用,智能LED灯的控制,还是HomeKit的协议,你都会发现,原来他们都选择低功耗蓝牙技术(BLE)是有这么多原因的。
&(阅读634次)
&(阅读1354次)
&(阅读620次)
&(阅读821次)
&(阅读1248次)
&(阅读1168次)
&(阅读1599次)
&(阅读1213次)
&(阅读1059次)
&(阅读1186次)
&(阅读1368次)
&(阅读1395次)
&(阅读1355次)
&(阅读1058次)
&(阅读1274次)
&(阅读1234次)
&(阅读1801次)
&(阅读1306次)
&(阅读1672次)
&(阅读1303次)
Copyright & 2006 深圳市康高电子有限公司(CONGO) 粤ICP备号-1
地址:深圳市龙华新区民治人民南路中航天逸花园A2栋A单元2602室 电话:9 (沈先生) 传真:0基于APP&Inventor的蓝牙4.0(BLE)数据通信_Barrette_Geek_新浪博客
基于APP&Inventor的蓝牙4.0(BLE)数据通信
&本科毕业设计要用到蓝牙4.0(芯片选用TI公司的CC254x系列)与手机客户端的数据交互,但是作为一名硬件汪,想在短时间内学习Java并且完成蓝牙4.0手机客户端的制作对我来说有点困难~~额,不,是几乎不可能。。。所以,偶然间发现的AI2工具对我来说简直神器,况且又是我心爱的马萨诸塞理工学院负责维护更新的。上手之后发现国内的在线版本不支持蓝牙4.0,辗转问了好多人,无果,最后终于在一家台湾的网站上发现了有关BLE通信的APP制作方法,现在总结一下。
&第一步:得到一个可以浏览国外网站的VPN
&有VPN账号的直接登录就好啦~没有的话可以去淘宝买(搜索时输入服务代理即可),很便宜的一个月十几块。下面这个链接​​,是我买VPN的淘宝店链接,一个月16.5元网速还可以。
&/item.htm?id=​
VPN登录界面
​​​
输入账号密码即可浏览国外网站。
&第二步:​登录MIT的BLE测试网址
&目前为止,国内以及国外的AI在线版都不支持BLE​通信,唯一支持的是MIT的专门为BLE开设的测试版,网址链接为:
&http://ble-test.appinventor.mit.edu/#;
&PS:第一次打开的时候谷歌可能会要求验证谷歌账号,有的话直接验证就好,没有的可以注册一个,很方便。​
下图为BLE在线测试版​的截图:​
BLE在线测试版
&可以发现,在线测试版和正式版几乎是一模一样的,区别在哪里呢?唯一的区别就在于BLE测试版添加了蓝牙4.0的组件,如下图所示:
蓝牙4.0控件
​ & &
& 由上图可以看出,BLE在线测试版添加了“BluetoothLE”(全称为Bluetooth
Low Energy), 即BLE组件,通过该组件可以进行有关蓝牙4.0数据的接受与发送。
&第三步:熟悉BLE各种逻辑语句​
&首先是控制语句:​
BLE组件的控制语句
​①
当BLE设备被连接时,执行下列语句。该语句一般用作连接成功后改变显示状态;
当BLE设备被发现时,执行下列语句。该语句一般​用作被发现之后改变列表中地址值;​
③ 当BLE设备的RSSI值改变时,执行下列语句​。
该语句一般用作检测搜寻附近蓝牙设备;
当从BLE设备读或写的值改变时,执行下列语句。​该语句一般用作数据通信;
当BLE设备的值被读取时,执行下列语句。​该语句一般用作数据通信;
当BLE设备的值被写入时,执行下列语句。该语句一般用作数据通信。
&其次是过程语句:
BLE组件的过程语句1
​①
连接Index中的BLE设备。该语句一般和列表一起使用;
连接已知地址的BLE设备。该语句用来进行与已知地址的BLE设备进行连接;
③ ​
断开已知地址的BLE设备。该语句用来 断开已知地址的BLE设备;
读取​Index中的BLE设备地址。该语句一般和列表一起使用;
​读取​Index中的BLE设备名称。该语句一般和列表一起使用;
​读取​Index中的BLE设备RSSI值。该语句一般和列表一起使用;
在已知设备UUID和特征值UUID的BLE设备上读一个字节变量。该语句用作与已知设备的数据通信;
⑧​&在已知设备UUID和特征值UUID的BLE设备上读一个浮点型变量。该语句用作与已知设备的数据通信。
BLE组件的过程语句2
​①&在已知设备UUID和特征值UUID的BLE设备上读一个整型变量,offset是偏移的位数。该语句用作与已知设备的数据通信;
​在已知设备UUID和特征值UUID的BLE设备上读一个字符型变量,offset是偏移的位数。该语句用作与已知设备的数据通信;
③ 开始扫描BLE设备。该语句一般在开始时使用;
④ 结束扫面BLE设备;
​在已知设备UUID和特征值UUID的BLE设备上写入一个整型变量,offset是偏移的位数,value是待写入的值。该语句用作与已知设备的数据通信;
​在已知设备UUID和特征值UUID的BLE设备上写入一个
浮点型变量,offset是偏移的位数,value是待写入的值。该语句用作与已知设备的数据通信;
​得到被支持的GATT服务。
&最后是逻辑语句:
BLE组件的逻辑语句
​①
BLE设备中一个字节变量的值;
② 已连接BLE设备中的RSSI值;
③ BLE设备的设备列表;
​BLE设备中一个整型变量的值;
⑤ BLE设备已连接;
​BLE设备中一个字符型变量的值;
⑦ BLE设备。​
&第四步:数据的发送与接收
蓝牙4.0通信逻辑图
上图所示是在已知UUID的BLE设备中,向特征值3写入字符1,然后读特征值5,显示在标签文本上。上图中,设备的UUID是“0000FFF0-00-FB”,特征值3的UUID是“0000FFF3-00-FB”
​,,特征值5的UUID是“0000FFF3-00-FB”。
&蓝牙4.0的数据通信主要是通过特征值来完成的,我们也可以根据需要自行添加特征值​。每个设备都有不同的UUID,怕麻烦的话可以借助一些辅助的手机软件来读出来,比如TI官方的“BLE
Device Monitor”或者“nRF Master Control Panel”,推荐后者,功能较多。
任何有问题的地方,欢迎留言交流!​
附:参考网址​
1. 基于AI2的BLE​的基础运用:
链接1:/programming-language/appinventor/app-inventor-藍牙4-0-ble-part-1-led-閃爍/
链接2:​/programming-language/appinventor/app-inventor-物聯網應用-藍牙4-0-ble-lesson-2-led-pwm呼吸燈/
2. 基于AI的传统蓝牙通信:
链接:.cn/s/blog_v65p.html​
3. 好用的AI中文学习教程:
链接:​http://www.17coding.net/
Barrette_Geek
博客等级:
博客积分:0
博客访问:3,640
关注人气:0
荣誉徽章:IOS BLE4.0蓝牙和外设连接和收发数据的流程
时间: 12:36:44
&&&& 阅读:6383
&&&& 评论:
&&&& 收藏:1
标签:前言:
苹果在IOS 6系统之后开始支持BLE 4.0,iPhone4s,iPod 5,iPad 3等之后的机型开始内嵌BLE4.0硬件,因此在开发前请先确认你的开发环境符合上述要求,并且苹果在BLE4.0之后,对外部的连接设备已经不在需要MFI认证了,当然你的外设肯定得要有蓝牙4.0模块了
开发BLE4.0的App,你需要在你的项目里面导入框架:
CoreBluetooth.framework
在需要使用到蓝牙的文件里面你需要导入头文件:
#import&&CoreBluetooth/CoreBluetooth.h&
#import&CoreBluetooth/CBService.h&
并且你需要在你的蓝牙类里面实现两个协议,CBCentralManagerDelegate ,CBPeripheralDelegate
现在我们需要有两个实例对象CBCentralManager和CBPeripheral,第一个是蓝牙中心管理器,主要用来搜索外设,连接外设以及处理外设断开的情况;第二个主要用于在蓝牙中心管理器成功连接外设之后的一系列动作,如:读取外设的服务号CBService,特征值号CBCharacteristic以及对这些特征值号进行读写操作等,下面我们来看一下IOS这边和外设联机的一个大概流程:
1):IOS这边蓝牙中心管理器开始扫描广播包(扫描的时长可以自己写一个定时器控制,并且可以设定扫描的具体条件)
2):外设开始广播(当然外设的广播时长也是可以设定的,这是硬件那边的事了,我不太懂)
3):IOS发现有广播包,就请求连接外设(这是底层自动实现,我们不需要写代码),之后外设会接收到连接请求,如果外设接收这个连接请求,就会给IOS那边发送一个连接请求的确认包,当IOS这边收到这个包后,两边设备就完成了连接(当然,由于连接底层已经写好,比较复杂,我讲的比较肤浅,只是一个大概步骤而已)
4):连接成功之后IOS这边就可以读取外设的相关信息了,比如服务号CBService,特征值号CBCharacteristic,还有外设的一些硬件信息,电池电量,信号强度RSSI什么的
5):当然在正常连接的过程中总会出现点意外,如果两个设备突然断掉了连接,一般我们还是希望它们能够再次连接的,这里就得要看硬件和IOS程序里对于连接断开的处理代码了
6):当然,外设和IOS端也可以主动发起断开连接的请求
下面我们看看IOS端具体的代码流程和基本的含义,你只需要跟着我的顺序走就可以了,以下顺序符合IOS BLE4.0联机的流程:
&在你的蓝牙类的初始化里面,先实例化一下中心设备管理器
_centralMan =& [[CBCentralManager&alloc]&initWithDelegate:self &queue:nil];
代码很简单吧,只需要一行就可以了,主要是要设置委托的对象,至于是否要加入某个队列,就看你的需求了,还记得我们蓝牙类里面继承了CBCentralManagerDelegate ,CBPeripheralDelegate两个协议吧,你可以跟进去看一下里面的协议方法,我就不多说了,先讲第一个需要实现的协议方法
-&& (void)centralManagerDidUpdateState:(CBCentralManager&*)central
这个方法主要是来检查IOS设备的蓝牙硬件的状态的,比如说你的设备不支持蓝牙4.0,或者说你的设备的蓝牙没有开启,没有被授权什么的,一般是在你确定了你的IOS设备的蓝牙处于打开的情况下,你才应该执行扫描的动作,[_centralMan&scanForPeripheralsWithServices:Nil&options:Nil];&我记得我之前没有检查蓝牙的状态就直接扫描了,虽然项目可以运行,但是控制台给出了一大堆的警告什么的,看着很烦人,那么我们执行扫描的动作之后,如果扫描到外设了,就会自动回调下面的协议方法了
-&& (void)centralManager:(CBCentralManager&*)central didDiscoverPeripheral:(CBPeripheral&*)peripheral advertisementData:(NSDictionary&*)advertisementData RSSI:(NSNumber&*)RSSI
这个方法里面的信息量可是比较大啊,看那个CBPeripheral,你在这个方法里面你就已经可以获取它的名称了可以使用peripheral.name来获取名称,当然,这里还可以获取设备的一个广播名称&NSString&*CBName=[advertisementData&valueForKeyPath:CBAdvertisementDataLocalNameKey]; 这两个名称一般是不一样的,除非你们硬件那边把人家写一样了,当然还有其他的很多信息,具体看代码吧;在这个回调里我们可以获取外设的广播包信息,当然我们就可以根据广播包的信息符合不符合你们的自定义的协议,符合就可以发起连接请求了,这样可以避免连接上其它一些自己不希望连接上的外设;当然你应该也看到了这里还有一个RSSI的值,这里是广播包附带过来的,根据这个值我们可以大概估计出广播设备里我们IOS设备有多远,如果信号太弱距离过远,我们是不是就不考虑连接这个外设了;这里我们假设广播包数据符合条件,我们发起了连接请求[_centralMan&connectPeripheral:_peripheral&options:Nil];那么如果连接成功,就会回调下面的协议方法了:
-&& (void)centralManager:(CBCentralManager&*)central didConnectPeripheral:(CBPeripheral&*)peripheral
如果你能回调到上面这个方法,说明你已经成功连接外设了,具体你可以打个断点试试,既然连接已经成功,我们就该考虑是不是要停止中心管理设备的扫描动作了,要不然在你和已经连接好的外设进行数据沟通时,如果又有一个外设进行广播且符合你的连接条件,那么你的IOS设备就会也去连接这个设备(因为IOS BLE4.0是支持一对多连接的),导致数据的混乱。所以我们在这个方法里面停止扫描动作:[_centralMan&stopScan];& 现在是时候让我们的第二个实例对像出场了& CBPeripheral,这里需要注意的是,记得要设置CBPeripheral的委托对象&_peripheral.delegate&=为了以后使用方便,我们还是一次性读出外设的所有服务UUID:[_peripheral&discoverServices:nil];这样一旦我们读取到外设的相关服务UUID就会回调下面的方法:
-&& (void)peripheral:(CBPeripheral&*)peripheral didDiscoverServices:(NSError&*)error
接着在这个方法里面我们还可以接着往里面剥,读取某个CBService&里面的特征值UUID:[peripheral&discoverCharacteristics:nil&forService:s];同上,如果我们成功读取某个特征值UUID,就会回调下面的方法:
-&& (void)peripheral:(CBPeripheral&*)peripheraldidDiscoverCharacteristicsForService:(CBService&*)service error:(NSError&*)error
能进入到这个方法,说明你已经读取到某个特征值UUID了,到达这一步,我们基本上也完成对外设的层层剥离了,接下来就是一些对某个特征值的读写操作了,当然我们首先要找到我们需要写数据的特征值UUID了,这里我们可以简单地通过循环来找出外设含有的某个特征值UUID:
for(int&i=0; i & service.characteristics. i++) {
&&&&&&&CBCharacteristic&*c = [service.characteristicsobjectAtIndex:i];
& & & & &&if&([[c&UUID]&isEqual:[CBUUIDUUIDWithString:@"FFF1"]])
& & & & & & & & & & { //你的动作}
在这里我们需要强调一下,由于特征值UUID是外设设定的,并且特征值UUID的属性properties有很多种,比如Read,WriteWithoutResponse,Write,Notify等等,因此你需要根据你们之间的协议还确定对某个特征值UUID怎么处理了,当然你也可以自己读出来这个特征值UUID的属性:c.properties,这里我们假设一个特征值UUID :&FFF1&的属性为WriteWithoutResponse,我们往里面写一个数据
Byte&dataArr[2];
dataArr[0]=0 dataArr[1]=0
NSData&* myData = [NSData&dataWithBytes:dataArr&length:2];
[_peripheral&writeValue:myData&forCharacteristic:c&type:CBCharacteristicWriteWithResponse];
这样我们就完成了一次向外设写数据,但是如果外设的特征值UUID是Read,怎么办呢?比如说获取外设的电池电量信息(注:这个属于标准服务里面自带),服务UUID:&180F&,特征值UUID:&2A19&,我们可以这样写:
[_peripheral&readValueForCharacteristic:cbc];
cbc就是指特征值为&2A19&的特征值对象,当然还有属性为Notify的,方法和这个类似:[peripheralsetNotifyValue:YES&forCharacteristic:c];
那么我们设置读这个特征值对象的值了,怎么接收它发过来的值呢,其实如果外设有特征值对象的值更新了,会自动回调下面的方法:
-&& (void)peripheral:(CBPeripheral&*)peripheraldidUpdateValueForCharacteristic:(CBCharacteristic&*)characteristic error:(NSError&*)error
在这个回调函数里面我们就可以根据characteristic的值来判断是哪个特征值UUID发送过来的值了,那个peripheral主要是用来判断是哪个外设发送的值,主要用于蓝牙一对多的情况,如果是一对一的,基本没用。那么我们再说一下怎么输出接收到的值,就以接收电池电量来说吧,看代码:
if&([[characteristic&UUID]&isEqual:[CBUUID&UUIDWithString:@"2A19"]]){
&&&&&&&&&&&const&unsigned&char&*hexBytesLight = [characteristic.valuebytes];
&&&&&&&&&&&NSString&* battery = [NSStringstringWithFormat:@"%02x", hexBytesLight[0]];
&&&&&&&&&&&NSLog(@"batteryInfo:%@",battery);
& 其实,外设向IOS这边发数据,都会自动回调上面的那个方法,因此你接收外设发送过来的数据,也只能在这个方法里面,通过不同的特征值判断是哪个UUID发送过来的,解析出数据再执行相应的动作就可以了,好了到这里我们应该很清楚IOS和外设是怎么进行数据沟通的了,如果还想深入就靠你自己了,当然我们最后再说一点,如果连接上的两个设备突然断开了,程序里面会自动回调下面的方法:
-&& (void)centralManager:(CBCentralManager&*)central didDisconnectPeripheral:(CBPeripheral&*)peripheral error:(NSError&*)error
在这个方法里面,我们可以做一些补救措施,比如回连,我们就可以在这个方法里写上:
[_centralMan&connectPeripheral:_peripheral&options:nil];
从这个方法里,我们还可以输出连接断开的原因:我们这样写:error.code,跟进去看会发现错误的原因有很多种,比如说CBErrorConnectionTimeout,CBErrorOperationCancelled,CBErrorPeripheralDisconnected,你可以根据错误的原因来进行不同的动作,好了,其实还有很多的回调方法,大家可以去看苹果官方的文档,这里只列出了一些常用的而已,水平有限,有不到之处,还请指证!如果大家还有什么疑问可以加我 QQ:;额,最好还是发邮件到QQ邮箱吧!
最近两天写了一个demo,放在Github上面了,地址是:&,模仿lightblue写的,由于各种原因,没有写完全,可供参考,转载http://m.blog.csdn.net/blog/liang_ke_ke/标签:
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!}

我要回帖

更多关于 手机蓝牙模块 的文章

更多推荐

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

点击添加站长微信