6113|4

655

帖子

29

TA的资源

版主

楼主
 

【2】蓝牙遥控平衡小车之蓝牙基础 [复制链接]

本帖最后由 lb8820265 于 2015-9-13 11:32 编辑

    接着前面的来,有评论说需要蓝牙的APP,那么这次我就先讲蓝牙APP的制作吧。蓝牙使用的芯片是CC2541,这是一款蓝牙4.0芯片,BLE芯片大势所趋,如果还用2.0那就OUT了,而安卓系统在4.3版本以后才开始支持BLE。如果想要能够成功的编写好蓝牙APP,那么安卓4.3以上系统加支持蓝牙4.0的手机是必须的。


      首先我还是从分析官方的代码开始吧,安卓支持BLE之后,发出了一个demo,这个demo大家可以通过在Android studio软件中File->Import Sample然后找到“Bluetooth Le Gatt”和“Bluetooth Chat”两个工程,一个是用来搜索设备+显示服务的,另一个是用来在两个手机之间通信的。“Bluetooth Chat”这个实测能够搜索到蓝牙4.0设备但是无法通信。如果你的电脑不能连上Google,那可能就不能打开Import Sample,那么我将两个工程放到文章末尾供大家下载,先看看Bluetooth Le Gatt工程,我是用的1.2.2版本的IDE

         工程文件如下图:


    首先看AndroidManifest.xml文件,这个里面主要是注册了两个Activity,一个是DeviceControlActivity一个是DeviceScanActivity,而这个Activity的属性设置为开始启动,那么接下来看这个DeviceScanActivity,先看onCreate函数,这个函数是最先运行的函数,函数作用为修改标题为,然后检查是否支持BLE然后获取手机的蓝牙适配器句柄。然后程序接下来运行onResume函数,这是Activity规定的,详细请查看Activity的生命周期,这里将部分函数放到onResume函数中而不是onCreate中,这主要是在退出Activity时候运行onPause,然后再次运行的时候就会运行onResume,而不会运行onCreate。onResume函数作用是确认是否打开蓝牙,没有打开就提示用户打开,然后在列表中取出蓝牙的适配器,然后就是运行scanLeDevice函数,这个里面运行.starLeScan,运行10秒,在搜索到的返回函数mLeScanCallback中将搜索到的设备添加到。到此程终止了,那么接下来就是用户操作了,列表中都添加了点击相应函数接下来看onListItemClick函数,首先获取用户点击的是哪个设备,然后将设备名和地址都用传值的Intent传送并启动DeviceControlActivity,如果还在搜索那么就停止搜索。

     接下来看DeviceControlActivity,先看onCreate函数,先绑定gatt_services_characteristics布局文件,然后获取上一个Activity传过来的地址是设备名并显示在界面上,然后是用bindService方法绑定BluetoothLeService服务,重写onServiceConnected函数,在里面获取手机蓝牙适配器然后运行connect,作用是连接指定的地址设备,这个connect函数是写在BluetoothLeService服务类中,之后讲解。重写onServiceDisconnected函数,在里面清空适配器服务。onResume函数和onPause函数作用分别是注册和注销广播接收器,广播接收器这里能够接收的广播有ACTION_GATT_CONNECTED,ACTION_GATT_DISCONNECTED,ACTION_GATT_SERVICES_DISCOVERED,ACTION_DATA_AVAILABLE,当然CC2541还有很多服务,可以都自己设置广播来接收。广播接收器稍后讲解。

     下面来看BluetoothLeService服务,先看connect函数,这个函数在前面调用过,这个函数在确定一切正常之后,调用connectGatt函数,然后函数中有一个回调函数mGattCallback,它有多种方法,它重写了onConnectionStateChange,onServicesDiscovered,onCharacteristicRead,onCharacteristicChanged,当然还有其他的,比如onReadRemoteRssi只是它没有重写。这里就挑onServicesDiscovered讲下,一旦发现服务,便进入到这个函数中,然后运行broadcastUpdate函数,broadcastUpdate中运行sendBroadcast将广播发送出去,然后在DeviceControlActivity类中BroadcastReceiver函数接收广播,收到广播后运行displayGattServices函数,这个函数很长,作用就是将服务放到列表中。然后列表中设置按钮监听OnChildClickListener,这里面涉及到两个函数,一个是setCharacteristicNotification,在BluetoothLeService类中,在这个是用来开启和关闭数据的接收的,然后是readCharacteristic函数,这个是用来读取收到的数据的。

    上面的例程什么都好,但是却唯独缺少了数据发送函数。下面我就在这个官方例程的基础上添加发送函数,其实相当的简单,只需要修改两个地方,首先在BluetoothLeService类中添加如下函数:
public void writeCharacteristic(BluetoothGattCharacteristiccharacteristic) {
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapternot initialized");
        return;
    }
    mBluetoothGatt.writeCharacteristic(characteristic);
}
然后在DeviceControlActivity类中列表点击响应servicesListClickListner函数后面添加如下函数:
if((charaProp & BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) {
    byte[] t = {0x02,0x00
};
    characteristic.setValue(t);
    characteristic.setWriteType(characteristic.getWriteType());
    Log.i("Gatt", "write--- characteristic value "
);
    mBluetoothLeService
.writeCharacteristic(characteristic);
}

     好了,大功告成了。那么接下来实机运行一下,CC2541与电脑串口相连。APP运行后搜索设备单击连接后会出现很多服务,然后这里点击ff00服务再点击ff02,然后通过电脑串口发送“hello word”,同时可以通过点击ff01可以向CC3541发送0x20 0x00的数字,至于为什么是这几个UUID那就要自己看CC2451的介绍了。APP图与串口图如下:


    好啦,现在实现了蓝牙数据的收发,接下来做的事情就简单了,只需要画画界面,设置好通信协议就能就能实现蓝牙遥控了,今天到这里,如果大家感兴趣,我再将蓝牙遥控器中如何最大化的利用蓝牙,通信协议的编写,界面的编辑分享给大家。
Bluetooth Le Gatt官方例程源代码:https://download.eeworld.com.cn/detail/lb8820265/557718
Bluetooth Chat官方例程源代码:https://download.eeworld.com.cn/detail/lb8820265/557717
Bluetooth Le Gatt修改能够实现收发:https://download.eeworld.com.cn/detail/lb8820265/557719







最新回复

多谢分享也  详情 回复 发表于 2018-11-13 22:32
点赞 关注(3)
个人签名QQ:252669569
 

回复
举报

5263

帖子

236

TA的资源

管理员

沙发
 
多谢分享也
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
没有CC2541模块,另外,小米好像调试不了APP,再去搞个便宜点的安桌机。楼主,要记得及时更啊,至少是周更啊!
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

4
 
如今大环境下还能看到如此诚意的帖子,真是感动的痛哭流涕啊~!一万个赞~!
 
 
 

回复

10

帖子

4

TA的资源

一粒金砂(初级)

5
 
多谢分享也
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表