公司项目,需要开发一个,手机蓝牙通过蓝牙模块和传感器通信的软件

手机app:

       

我是先看了android官网关于蓝牙这方面的知识(https://developer.android.com/guide/topics/connectivity/bluetooth),

然后参考的(https://blog.csdn.net/huangliniqng/article/details/82185983),

最后写完后,又找个一篇巩固了一下知识(https://blog.csdn.net/qq_25827845/article/details/52997523)

我这里写一些主要的方法步骤:

第一步:在Androidmanifest.xml 中添加权限

<uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

其中,权限1在得到默认蓝牙适配器时需要,即BluetoothAdapter  mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter( )

权限2在mBluetoothAdapter.enable( )或者mBluetoothAdapter.disable( ) 时需要使用到。

第二步:判断蓝牙是否支持、打开,开始搜索、配对、然后进行连接

1.判断蓝牙是否打开,得到的默认适配器不为空的时候支持蓝牙:

        bluetoothAdapter= BluetoothAdapter.getDefaultAdapter();if(bluetoothAdapter!=null){//支持蓝牙}else {ToastUtil.show(context,"不支持蓝牙");}

2.判断蓝牙是否打开:

             //蓝牙是否打开if(!bluetoothAdapter.isEnabled()){bluetoothAdapter.enable();//启动蓝牙}

3.开始搜索,搜索的结果以广播的形式进行发送出来:

   bluetoothAdapter.startDiscovery();//开始搜索,搜索出的结果将以广播的形式发送出来

4.注册广播,接收搜索结果并将其适配到ListView中:

mainActivity中注册,开始搜说后,每搜索到一个设备就会发送一个广播,广播接收着就能接收到并作相关处理,我这里的处理是——每接收到一个找到设备广播后,得到这个设备,并将其发送到mainctivity中,mainActivity中进行解析。

 registerReceiver(blueToothReceiver,blueToothReceiver.markFilter());//动态注册广播
public class BlueToothReceiver extends BroadcastReceiver {private int pairingSuccess=5;@Overridepublic void onReceive(Context context, Intent intent) {switch (intent.getAction()){case BluetoothAdapter.ACTION_STATE_CHANGED:int blueStat= intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,0);switch (blueStat){case BluetoothAdapter.STATE_TURNING_ON://蓝牙打开中break;case BluetoothAdapter.STATE_ON://蓝牙打开完成break;case BluetoothAdapter.STATE_TURNING_OFF://蓝牙关闭中break;case BluetoothAdapter.STATE_OFF://蓝牙关闭完成break;}break;//开始扫描case BluetoothAdapter.ACTION_DISCOVERY_STARTED:EventBus.getDefault().post(new BluRxBean(STARTSCAN));break;//找到设备case BluetoothDevice.ACTION_FOUND://将得到的设备发送给前端处理EventBus.getDefault().post(new BluRxBean(BlueToothId.RECEIVER_MESSAGE_Byte,(BluetoothDevice)intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)));break;//搜索完成case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:EventBus.getDefault().post(new BluRxBean(ENDSCAN));break;//状态改变case BluetoothDevice.ACTION_BOND_STATE_CHANGED:BluetoothDevice de =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);switch (de.getBondState()) {case BluetoothDevice.BOND_NONE:break;case BluetoothDevice.BOND_BONDING:ToastUtil.shortShow(context,"配对中");break;case BluetoothDevice.BOND_BONDED:ToastUtil.shortShow(context,"配对成功");EventBus.getDefault().post(new BluRxBean(pairingSuccess));break;}break;}}public IntentFilter markFilter(){IntentFilter filter=new IntentFilter();filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);//蓝牙状态改变的广播filter.addAction(BluetoothDevice.ACTION_FOUND);//找到设备的广播filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索完成的广播filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);//开始扫描的广播filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);//状态改变return filter;}
}

5.mainActivity中解析得到的设备,并将其适配到ListView中

这里需要两个List集合,一个方存放设备(用于listview点击事件中用到,知道点击的那个设备,才能进行连接)

另一个,将设备的名字、状态、图表放进map中,然后放在list中(用于适配到listView中)

  listBlueToothReceiver.add(bluRxBean.getBluetoothDevice());Map<String, Object> map = new HashMap<>();map.put("deviceName", bluRxBean.getBluetoothDevice().getName() + "\n" + bluRxBean.getBluetoothDevice().getAddress());if(bluRxBean.getBluetoothDevice().getBondState()!=BluetoothDevice.BOND_BONDED){map.put("statue", "未配对");map.put("image",R.drawable.unline);} else {map.put("statue", "已配对");map.put("image",R.drawable.line);}btDetails.add(map);adapter=new BlueToothDataAsapter(context,btDetails);list.setAdapter(adapter);

6.ListView点击事件,配对并连接设备

  //ListView点击事件list.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, final int position, long id) {Map<String,Object> map;map = btDetails.get(position);if (map.get("statue").equals("已配对")) {//如果已经配对成功就进行连接alertDialog = DialogUtils.dialogloading(context, "正在连接", false, false);poolExecutor.execute(new Runnable() {@Overridepublic void run() {connect(listBlueToothReceiver.get(position));}});}else {//开始配对try {listOnClickItem=position;//如果想要取消已经配对的设备,只需要将creatBond改为removeBondMethod method = BluetoothDevice.class.getMethod("createBond");Log.e(getPackageName(), "开始配对");method.invoke(listBlueToothReceiver.get(position));} catch (Exception e) {e.printStackTrace();}}}});//-----蓝牙连接代码,项目中连接会使用封装的工具类,在这里提取重写--------private void connect(final BluetoothDevice bluetoothDevice) {new Thread(new Runnable() {@Overridepublic void run() {try {//得到客户端SocketmBluetoothSocket = bluetoothDevice.createRfcommSocketToServiceRecord(BlueToothId.SPP_UUID);if (mBluetoothSocket != null) {App.bluetoothSocket = mBluetoothSocket;//保证Socket的生命周期最长if (bluetoothAdapter.isDiscovering()) {//如果正在发现bluetoothAdapter.cancelDiscovery();//停止发现}if (!mBluetoothSocket.isConnected()) {//如果没有链接mBluetoothSocket.connect();//进行连接}EventBus.getDefault().post(new BluRxBean(connectsuccess, bluetoothDevice));}} catch (Exception e) {e.printStackTrace();try {mBluetoothSocket.close();DialogUtils.dimissloading(alertDialog);} catch (Exception e1) {e1.printStackTrace();}}}}).start();}

第二步:通信

1.发送消息

 private void sendMessageByte(byte[] message){if(bluetoothSocket!=null&&message.length>0){try {outputStream= bluetoothSocket.getOutputStream();//得到输入流outputStream.write(message);outputStream.flush();} catch (IOException e) {e.printStackTrace();}}}

2.接收消息

  public void receiveMessageByte(){Log.e("3    ","接收到数据");if(App.bluetoothSocket==null)return;try {in=App.bluetoothSocket.getInputStream();//得到输入流out = new ByteArrayOutputStream();//得到字节数组输出流while (true){readByte();}} catch (IOException e) {e.printStackTrace();}finally {try {in.close();out.close();} catch (IOException e) {e.printStackTrace();}}}public void readByte() throws IOException {int ch=0;while ((ch=in.read())!=-1){if(lastHitCount!=hitCount){out.close();out = new ByteArrayOutputStream();//得到字节数组输出流}out.write(ch);content = out.toByteArray();EventBus.getDefault().post(new BluRxBean(RECEIVER_MESSAGE_Byte,content));lengthOutput=content.length;Log.d("接收数据长度:" , content.length+"");lastHitCount=hitCount;}}

到此重点差不多就完了,具体代码可下载看:

链接:https://pan.baidu.com/s/1o7VcQmHj78BcpDld776Bmg 
提取码:ntax

手机蓝牙和蓝牙模块进行通信相关推荐

  1. android:手机与BLE-CC41-A蓝牙模块通信

    原创地址:http://blog.csdn.net/bigtree_mfc/article/details/53783585 手机蓝牙的开启.搜索就不再多说,和手机之间的蓝牙通信一样. 需要注意的安卓 ...

  2. HC-05(ZS-040)蓝牙模块使用详情(蓝牙模块配置、手机蓝牙控制单片机、蓝牙与蓝牙之间的通信)含51、32程序

    HC-05是一款主从一体化的蓝牙模块,因此其使用起来比较方便,只需要进行简单的配置即可. 本文就手把手的介绍小白入手模块后如何使用. 对于模块使用:1.蓝牙配置→2.手机与蓝牙的传输→3.手机通过蓝牙 ...

  3. Android蓝牙遥控器(通过手机蓝牙与蓝牙模块通信)

    前些天学弟让我给他整理之前一起做项目时的与下位机通信的部分代码.当时使用蓝牙编程,Android端通过蓝牙发送指令到蓝牙模块,硬件那里通过蓝牙模块读取到指令,并执行相应操作.由于那段代码时在工程里的, ...

  4. Android端 同 单片机 利用蓝牙模块的通信实现

    这次期末的课程设计做了一个智能灯光控制系统,系统整体的功能不在此赘述,系统主要是要实现下位机同上位机的通信,上位机选用的是Android手机端,下位机是52单片机,通过蓝牙模块实现通信.虽然系统很简单 ...

  5. 小白学习HC-05蓝牙透传模块(有实例讲解——自制手机app实现蓝牙控制单片机加热系统)第一天 :整体分析,理清思路

    小编刚开始接触HC-05蓝牙透传模块,只是感到很神奇.但对它的原理和使用方法一无所知.做项目要用到它的时候,无非就是代码复制粘贴,有种照搬照抄的意思. 但是今天小编要谈谈一段时间内对HC-05学习的心 ...

  6. android 与 蓝牙模块 hc06通信app 开发要点

    2016.8.24:这里非常抱歉,做完这个综合训练我个人忙于考研,没能第一时间把这篇博文写完.由于时间已经过了一年,而且我个人正在改行研究NLP,导致我现在对于其中一些要点已经忘记了.之前有些朋友私信 ...

  7. Android 7.0(华为荣耀2平板)蓝牙与蓝牙模块4.0通信

    1,问题:开发的蓝牙软件安装到平板上与蓝牙模块进行通信时,可以连接,但是不能通信.onServicesDiscovered(BluetoothGatt gatt, int status)方法并没有回调 ...

  8. HC-05蓝牙模块arduino通信实例代码以及注意事项

    HC-05蓝牙模块arduino通信实例代码以及注意事项 HC-05的接线及使用 进入蓝牙的设置模式 进入AT命令模式(设置蓝牙参数) 注意事项 进入AT模式的代码(注意在通电之前让蓝牙模块进入设置模 ...

  9. Android Studio制作手机App:通过手机蓝牙(Bluetooth)与STM32上的低功耗蓝牙(HC-42)连接通信,实现手机端对单片机的控制。

    背景: 本文的内容是针对单片机蓝牙模块(HC-42)开发的手机App.在这之前,我想先声明一点,手机与手机间的蓝牙连接方式"与"手机与HC间的蓝牙连接方式"是不一样的.原 ...

最新文章

  1. 【Qt】Ubuntu18.04下解决Qt出现qt.qpa.plugin:Could not load the Qt platform plugin “xcb“问题
  2. 将NetBIOS名称解析为IP地址的常用方法
  3. 【转】Android OTA 升级之一:编译升级包
  4. Leetcode 137. Single Number II JAVA语言
  5. 通过Fiddler进行手机抓包
  6. 基于改进SSD的车辆小目标检测方法
  7. mooc哈尔滨c语言作业答案,哈尔滨工业大学C语言2016年MOOC在线测试答案.doc
  8. arcgis 4.x graphicslayer点击事件_ArcGis中X、Y值的巧用方法小记
  9. 冠军轮流转:Q3 季苹果超越小米,回到全球最大的可穿戴设备厂商宝座
  10. 【9108】模拟数学计算器
  11. 计算机网络-扩展路由器
  12. 电脑锁屏按什么键解锁_锁屏键除了锁屏还能干什么?这 6 个 App 带你玩转手机实体键...
  13. JSP的九大内置对象
  14. 用Nginx禁止指定IP、国外IP访问我的网站
  15. linux通过编辑文档来网络互通,No.277 记录一下:隔离网络环境下,使用WPS 2019 for Linux无痕编辑Office文档(2019-08-04)...
  16. Centos7使用OpenTracker自建高性能Tracker服务器
  17. CMD查看端口和进程
  18. 学计算机需要什么基础
  19. meethigher-QQ发送卡片消息
  20. 关于 draw.io 矢量图 SVG 导出的研究

热门文章

  1. DirectoryInfo(查询)---遍历指定文件夹下所有文件及文件夹
  2. 网络设备的升级与备份
  3. 怎么释放C盘空间?清理C盘空间的4大方法分享!
  4. pytorch 定义torch类型数据_PyTorch 使用 TorchText 进行文本分类
  5. 六【 SpringMVC框架】
  6. trace-event
  7. 【小象学院】案例8——空气质量指数计算v7.0
  8. zzulioj 1029: 三角形判定
  9. 2018年算法工程师秋招经验贴(微软、华为、网易游戏、阿里offer)
  10. 每日学术速递1.29