2020/7/16更新:项目翻盘

一 项目流程概览:(已经将本项目中的敏感技术剔除,转化成通用的技术方案)

  • 申请权限(位置权限、提示使用蓝牙需要打开位置信息。打开蓝牙的权限,)
  • 扫描蓝牙
  • 连接/断开蓝牙
  • 接收/发送数据
  • 解析数据
  • 以图表动态的显示数据的变化
  • 保存数据到excel中

1.申请权限:
蓝牙权限:在manifest/AndroidManifest.xml中添加需要的所有权限(建议直接复制):

    <!-- 蓝牙、位置所需权限 --><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- 在Android6.0 定位权限申请 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 在Android10.0里,获取定位权限需要增加以下权限。 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/> --><!-- 过滤掉没有蓝牙BLE功能的蓝牙按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备均可正常安装运行,需要在代码运行时判断设备是否支持BLE feature: --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-featureandroid:name="android.hardware.bluetooth_le"android:required="true" />

2.扫描蓝牙

  • 扫描过程通过回调来实现,因此基础不孬者希望你自己去补充这方面的知识。
    【笔者比较笨,学了一周才理清楚一点】
    大致思路:在扫描页面中去实现bleutil类(一个将ble所有操作集中到一个地方的类,见源代码)的回调函数。
    /*** 扫描回调注册*/private void scanBle() {bleConnectUtil.bluetoothIsAble(new MyBleCallBack() {@Overridepublic void callbleBack(BluetoothDevice device) {Log.d(TAG,"--->搜索出蓝牙名字为:"+ device.getName());//device.getName():bleutil扫描到的蓝牙名字if (device == null) {return;}boolean NoAdd = true;//健壮性,可忽略for (BluetoothDevice oldDevice : listDevice) {//若多次扫描到同一设备。只显示一次if (oldDevice.getAddress().equals(device.getAddress())) {NoAdd = false;break;}}if (NoAdd) {//第一次扫描则将其加入到设备列表中去,listDevice等杂七杂八的见源代码listDevice.add(device);listDeviceName.add(device.getName());adapter.notifyDataSetChanged();//更新页面中的dataset}}});}

3.连接蓝牙

  • 用户通过点击列表中的设备从而进行蓝牙连接
//这个是重载。抄下来就Ok了public void onItemClick(AdapterView<?> parent, View view, int position, long id) {bleConnectUtil.stopScan();//stop scanselectPos = position;dialog.show();//不用管,流畅性处理。bleConnectUtil.connectBle(listDevice.get(position));//连接蓝牙,在bleutil那边会返回一个handler数值,在本页面中接受这个handler就知道是否接受成功了。}
//-------------------------------------------------检查连接结果----------------------------------------------------
1.子线程发送连接请求/*** Connet子线程、当点击蓝牙名字后重复向蓝牙发送链接请求,超过2次未成功发送连接超时msg给handler,成功则不用管*/Runnable checkConnetRunnable = new Runnable() {@Overridepublic void run() {if (!bleFlag) {//>2if (regainBleDataCount > 2) {//发送带标记的消息(内部创建了message,并设置msg.what = 1000)handler.sendEmptyMessage(1000);} else {regainBleDataCount++;sendDataByBle(currentSendOrder, "");//延时三秒发送消息handler.postDelayed(checkConnetRunnable, 3000);}}}};2.连接成功由bleutil通过eventbus向mainActivity发送成功信息和特性来完成。/*** 扫描蓝牙事件处理* @param eventMsg :接收蓝牙连接情况*/@Subscribe(threadMode = ThreadMode.MAIN)public void onEvent(EventMsg eventMsg) {switch (eventMsg.getMsg()) {case Constants.BLE_CONNECTION_FINISH_MSG:if (dialog != null) {dialog.dismiss();}bleConnectUtil.stopScan();btnScan.setText("扫描设备");//               todo 已连接,此处的bleConnectUtil是如何变成充满连接信息的呢?我理解的是bleutil用了main的bleConnectUtil去执行连接操作,人走,茶在。if (bleConnectUtil.isConnected()) {Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();tvBleName.setVisibility(View.VISIBLE);tvBleName.setText("您所连接的设备是:" + listDeviceName.get(selectPos));listview.setVisibility(View.GONE);
//                    写一个接受数据的回调。bleUtil一旦接受到数据便使用mainActivity里面的blecallback方法来处理数据.bleConnectUtil.setCallback(blecallback);}//未连接成功else Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();break;default:break;}}3.连接蓝牙相关其他情况(断开连接,超时)用Handler处理----------------------------------------------Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {
//收到消息,不是连接成功的提示,是收到蓝牙发送过来的消息!case 10:dialog.dismiss();tvReceiver.setText(msg.obj.toString());Log.d(TAG, "hand receive:"+msg.toString());EventBus.getDefault().postSticky(new DataMsg(msg.obj.toString()));break;
//连接超时 ,子线程向蓝牙发送链接请求,超时会给它发送1000,便是在这儿接收          case 1000:regainBleDataCount = 0;//这些是我自己写的标志符。不需要你去理解bleFlag = false;//这些是我自己写的标志符。不需要你去理解handler.removeCallbacks(checkConnetRunnable);//不用再发送链接请求if (dialog != null) {dialog.dismiss();}//超时处理//Toast.makeText(MainActivity.this, "超时请重试!", Toast.LENGTH_SHORT).show();break;//断开连接,或者发送数据失败case 1111://断开连接处理bleConnectUtil.disConnect();break;default:break;}}};

4.发送数据
发送数据未经过脱敏。这里放一个发送demo函数

private void sendDataByBle_hex(final byte[] currentSendAllOrder) {final boolean[] isSuccess = new boolean[1];//一个bool大小的发送状态标志符mBluetoothGattCharacteristic.setValue(currentSendAllOrder);//currentSendAllOrder即发送的字符串isSuccess[0] = bleConnectUtil.sendData(mBluetoothGattCharacteristic);//接受发送状态handler.postDelayed(new Runnable() {@Overridepublic void run() {if (!isSuccess[0]) {dialog.dismiss();handler.sendEmptyMessage(1111);//发送失败}Log.e("--->", "是否发送成功:" + isSuccess[0]);}}, (currentSendAllOrder.length / 40 + 1) * 15);//间隔一段时间再发送}

5.接受数据

由3.连接部分知我已经写好了接收数据的流程了。接下来补充一下具体的处理函数/*** 接受数据后的回调处理函数(mainactivity提供环境,bleutil来执行函数)*/private BleConnectionCallBack blecallback = new BleConnectionCallBack() {@Overridepublic void onRecive(BluetoothGattCharacteristic data_char) {bleFlag = true;//收到的数据byte[] receive_byte = data_char.getValue();
//            Log.d(TAG, "接受到的原始数据:"+receive_byte);
//String str = CheckUtils.toHexString1(receive_byte);
//            Log.d(TAG, "数据转化成16进制 is:"+str);//利用handler传值Message message = new Message();message.obj = str;message.what = 10;handler.sendMessage(message);}@Overridepublic void onSuccessSend() {//数据发送成功Log.e(TAG, "onSuccessSend: ");}@Overridepublic void onDisconnect() {//设备断开连接Log.e(TAG, "onDisconnect: ");Message message = new Message();message.what = 1111;handler.sendMessage(message);}};

项目已经完成,但是时间关系无法一次讲完。努力将代码脱敏,上传,更新ing。任何疑问可留言。笔者在CSDN买了房的。哈哈哈

  • 蓝牙扫描
  • 蓝牙连接,断开
  • 发送,接受数据
  • 根据CRC8算法解析,校验数据,利用折线图(MPchart)动态实时展示数据如电压,电流,压力等,对折线图的造作数据导出成excel并保存在本地
  • 批量发送设置参数信息到单片机串口,从而完成APP远程设置单片机的外设相关参数
  • 待续

骚话:

毕业菜鸟刚入职,在网上找了大大小小的安卓蓝牙BLE开源项目十几个了。都没有自己喜欢的,现在的计划是自己动手做一个。并且每天将自己学会的东西、认为项目中很重要的东西记录下来。(下面的项目都能运行,但是别人写的都是后台demo。美工和功能性不支持拿来即用,也怪不了别人。我自己加把劲弄一个出来吧)

  • 前三天的开发全是去Pilipli找视频资料、百度一些开源项目-努力让他们运行-测试手机和电脑能不能通过软件联通(这之间的蓝牙通讯称为经典蓝牙)。
    【因为发现自己做的蓝牙芯片叫JDY 10M,是BLE低功耗蓝牙,几天的努力化为泡沫】

2020/6/11日自己下定决心找一篇写的好一点的教程狠狠的阅读。十遍不行就二十遍!

奉上我拜读的文章: Android开发蓝牙与ble设备的通讯.

#这篇文章我也下载了他的源码来解读,后台功能很职场,需要有一些开发基本思维。(只是涉及到作者将功能模块分成许多文件,目的是解耦合和多复用性)

这里我不讲怎么去做。只是记录下自己每天学习的哪些关键点。项目完成再开贴去讲从头到尾做一个ble蓝牙安卓调试器


2020/6/12:

  • 改变自己一贯的白嫖、能用就Ok的思想,决定死抓一篇文章,分析他用了哪些函数(而不是关注函数内部是怎么运行的)
  • 读懂流程之后分析项目是怎样运行的。重点分析了安卓的回调机制。
  • 分析hander在安卓中的作用。

2020/6/13:

  • 昨天将app的功能基本实现了数据收发功能。死磕了两天的安卓回调。慢慢的心里面对回调机制有一定的了解,但是感觉自己还是不能分析出回调在源码中的运用。先跳过这个
  • 晚上2点多还在改导航栏。哎,自己太笨了,一直没把它和原来的项目结合着弄出来。心里别提多难过了、加油吧。

待记录问题:


安卓部分:

  • 蓝牙通讯数据包-进制与数据类型关系/数据包的解析/
  • char数组/String/怎么输出的
  • 单片机给上位机发送的数据通过CRC8循环校验的,我在APP里怎么去验证数据是否正确呢?
  • 折线图表要想显示成功,需要在界面处将多余的表的VISIBLE设置成GONE
  • 设置界面的数据输入。digitsl参数利用正则可以限定输入的内容、inputtype参数可以设置输入的软键盘类型。

调试部分:

  • USB转TTL上面有几个按键,记得把USB播成on、将48拨成off、蓝牙是接3.3V.这些一旦弄错便会烧掉芯片。切记
  • 将蓝牙芯片和USB转TTL、串口波特率选115200、勾中发送新行(电脑上的助手才这样)、打开串口,做完以上步骤开始调试。
  • (更名)发送 AT+NAME=BlueTest( 也可以这样:AT+NAMEBlueTest)
  • (波特率)因为单片机无法发送太快,需要设置波特率为9600、发送AT+BAUD=4(AT+BAUD4)
  • (保存设置)AT+RESET
附波特率参数设置表
Param:(0-7)
0:115200 bps
1:57600 bps
2:38400 bps
3:19200 bps
4:9600 bps
5:4800 bps
默认值:0

硬件部分:

  • DC电源牢记先连线再通电

备注:

我知道可以通过把原来的数据部分截取出来进行CRC算法得到的值和原来的尾部的校验值比较,来实现验证。但是我觉得接收数据没必要这么复杂,
我在网上找的CRC8资料可以:(数据+校验码)%多项式特征值==0。
如果余为零的话就证明数据无误。

  • APP界面跳转的时候以下两句一定要在OnCreate()前面。
        super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

总结: byte 8位,int 32位,char 16位,short 16位 都是数,只是长度不同,可以相互转换
2进制,8进制,16进制,只是一个数输出的进制方法,数值还是那个数
byte,int,char等的都是数据类型,进制只是数的表现形式

一个BYTE占8位。而16进制由四个二进制表示。所以说呀、一个BYTE能表示两位16进制数据。例如:byte[0]=‘2’ -》 0000 0010
任何疑问联系QQ: 498661202

低功耗(BLE)蓝牙模块开发之路相关推荐

  1. BLE蓝牙模块有哪些应用领域

    BLE蓝牙模块有哪些应用领域 1 蓝牙灯控方案 蓝牙灯控解决方案主要蓝牙模块为基础,实现智能蓝牙LED灯的色彩控制等功能. 蓝牙灯控方案说明:手机蓝牙和彩灯上的蓝牙模块进行配对,实现APP命令控制彩灯 ...

  2. BLE蓝牙模块的作用及应用场景

    转载自:https://jingyan.baidu.com/article/647f0115e226be7f2048a871.html 侵删 一.BLE蓝牙模块的作用 1. 蓝牙模块是一种集成蓝牙功能 ...

  3. BLE蓝牙模块的应用场景介绍

    BLE蓝牙模块的应用场景介绍 BLE蓝牙模块是极为常用的一种无线通信模块,其广泛应用于各种各类智能设备,主要应用包括:定位标签,资产跟踪,运动及健身传感器,医疗传感器,智能手表,遥控器,玩具等,下面就 ...

  4. Android App 连接ble蓝牙模块并进行通讯

    Android App 连接ble蓝牙模块并进行通讯 对于蓝牙的基础知识我在这里就不赘述了,直接来干货,讲解连接ble蓝牙模块并进行通讯,通讯使用广播模式,结尾附上一个项目的demo.精彩内容即将开始 ...

  5. 04_HUD_Qt_for_Python开发之路2

    欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈. 文章目录 HUD_Qt_for_Python开发之路2 1 设置程序名称 2 隐藏窗口标题栏 3 设置窗口透明裁剪 4 修改下 ...

  6. 05_HUD_Qt_for_Python开发之路3

    欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈. 文章目录 HUD_Qt_for_Python开发之路3 1 UI文件与Python结合 1.1 将UI文件编译为一个Pytho ...

  7. 记本阶段建站心得,是走无限做垃圾站之路还是真正的开发之路

    不知不觉,上班有三个月了,三个月除却一些公司里杂七杂八的事,我做了四个站,第一个是六安市志愿者会员管理系统,比较简单,用TP开发,从前台设计.布局,到数据库设计,再到后台代码,改了又改,最后花了近一个 ...

  8. 我的Java开发之路

    最近有一位小伙伴通过公众号给我留言, "我参加工作没多久,看着圈里的技术大牛,特别羡慕,也渴望成为技术大牛,想让您分享一下从小白到大牛是怎样练成的,我该如何提高自己" 首先,谢谢这 ...

  9. 细说inchat系统客户端开发之路

    Inchat系统中间件基础运行环境是经过统一规划的以WebLogic.JBOSS为主的集群环境,企业集成平台是以基础业务应用为基础服务于上层平台和基础业务应用的高度集成平台,数据中心是企业公共数据的集 ...

最新文章

  1. 『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81)
  2. 产品功能上线前,如何高效的埋点?
  3. SAP:2019年会有多么不一样?
  4. 神经网络基础之可视化和交互式指南
  5. 随机系列生成算法(随机数生成)
  6. pytorch中的 nn.ModuleList 和 nn.Sequential
  7. 决策树结果可视化中文乱码问题解决方案
  8. CVPR 2022 | AAAI2022 | WACV 2022 超分辨率(super-resolution)方向上接收论文总结
  9. 平行四边形周长和面积计算c语言,平行四边形的周长公式
  10. 单位载质量能量消耗量_Ekg指标计算案例之电动物流车
  11. 网络数据里的身份证实名认证接口,你了解多少?
  12. 铁矿石加速下跌,沪铜认购大涨,甲醇09-01季节性反套2022.4.22
  13. Android模似器硬件加速
  14. 计算机网络综合组网实验、综合组网实验
  15. 工具分享 | linemap-快速绘制山峦地图的R可视化包介绍
  16. 一文搞懂均匀分布、高斯分布、瑞利分布、莱斯分布(含MATLAB代码)
  17. GeoTools入门(六)-- 查询那点事
  18. 浩鲸科技 2021校招 java开发
  19. 树莓派学习002_双色LED灯实验
  20. 清除、删除、重置AD账户、OU属性值往AD的OU属性添加值

热门文章

  1. Kubernetes设计模式
  2. ActPro在日本约350个旅游景点安装开拓性的日本产自动货币兑换机
  3. android5能用的微信,微信8.0上线,安卓也能用!这5大功能新媒体人要注意!
  4. Vue开发实战十六:自定义弹框页面
  5. 亮宁机器人套件_亮宁机器人特有的符号系统(图文)
  6. python 趋势线计算式_如何计算股票价格指数的趋势线
  7. 安装单机诛仙服务器位置,诛仙单机版游戏
  8. html文本转换pdf,将html文本转换为pdf而不丢失格式
  9. 业务百搭、简单实用,这就是你需要的审批软件
  10. Java实战-优雅的合并Excel列中的相同内容