位置: 编程技术 - 正文

Android与蓝牙串口模块通信(android蓝牙连接过程)

编辑:rootadmin
&#;&#;由于项目的需要Android与蓝牙模块通信,发了时间学习了下,实现了Android与蓝牙模块的通信

推荐整理分享Android与蓝牙串口模块通信(android蓝牙连接过程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android开发蓝牙传数据,安卓手机蓝牙配对后怎么传软件,安卓6.0蓝牙传输协议,android 蓝牙,android 蓝牙,android蓝牙连接过程,android 蓝牙,android蓝牙连接过程,内容如对您有帮助,希望把文章链接给更多的朋友!

1.蓝牙串口模块使用SPP-CA模块

蓝牙串口模块就是使用单片机的TX ,RX与蓝牙模块通信,单片机通过TX发送数据给蓝牙模块,然后蓝牙模块在通过蓝牙协议把数据发送出去,蓝牙模块与Android的通信方式使用spp协议。

2.蓝牙通信

蓝牙的通信需要服务端和客户端,客户端搜索蓝牙设备,链接服务端。主要是通过socket通信,相关的知识可以学习了解下socket通信。链接建立起来,通信时数据的读写是通过输入输出流的方式读写。

3.Android蓝牙架构和api说明

查看《Android系统原理及开发要点详解》和《深入理解Android网络编程》里的蓝牙相关章节,2本书里相关的章节有详细的介绍。

4.uuid

Hint: If you are connecting to a Bluetooth serial board then try using the well-known SPP UUID ----F9BFB. However if you are connecting to an Android peer then please generate your own unique UUID.

这是Android官方文档的说明,如果是连接蓝牙串口模块使用通用的uuid ----F9BFB,如果是Android手机间的通信链接,可以使用生成的uuid,客服端和服务端的uuid必须相同,下面通过蓝牙串口助手读取回来的uuid,下面是我的蓝牙串口模块的uuid。

下面是读取手机的蓝牙的uuid,可以看到比较多的uuid,有比较多的服务。

另外下面是其他蓝牙设备的uuid,应该是蓝牙4.0的。

代码部分还是比较简单的,下面是android蓝牙链接的主要部分代码,也是参考网上的。

package gjz.bluetooth;

Android与蓝牙串口模块通信(android蓝牙连接过程)

import gjz.bluetooth.R;import gjz.bluetooth.Bluetooth.ServerOrCilent;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.UUID;import android.app.Activity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.bluetooth.BluetoothServerSocket;import android.bluetooth.BluetoothSocket;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.inputmethod.InputMethodManager;import android.widget.AdapterView;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;

public class chatActivity extends Activity implements OnItemClickListener ,OnClickListener{ /** Called when the activity is first created. */ private ListView mListView; private ArrayList<deviceListItem>list; private Button sendButton; private Button disconnectButton; private EditText editMsgView; deviceListAdapter mAdapter; Context mContext; /* 一些常量,代表服务器的名称 */ public static final String PROTOCOL_SCHEME_L2CAP = "btl2cap"; public static final String PROTOCOL_SCHEME_RFCOMM = "btspp"; public static final String PROTOCOL_SCHEME_BT_OBEX = "btgoep"; public static final String PROTOCOL_SCHEME_TCP_OBEX = "tcpobex"; private BluetoothServerSocket mserverSocket = null; private ServerThread startServerThread = null; private clientThread clientConnectThread = null; private BluetoothSocket socket = null; private BluetoothDevice device = null; private readThread mreadThread = null;; private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chat); mContext = this; init(); } private void init() { list = new ArrayList<deviceListItem>(); mAdapter = new deviceListAdapter(this, list); mListView = (ListView) findViewById(R.id.list); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener(this); mListView.setFastScrollEnabled(true); editMsgView= (EditText)findViewById(R.id.MessageText); editMsgView.clearFocus(); sendButton= (Button)findViewById(R.id.btn_msg_send); sendButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub String msgText =editMsgView.getText().toString(); if (msgText.length()>0) { sendMessageHandle(msgText); editMsgView.setText(""); editMsgView.clearFocus(); //close InputMethodManager InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editMsgView.getWindowToken(), 0); }else Toast.makeText(mContext, "发送内容不能为空!", Toast.LENGTH_SHORT).show(); } }); disconnectButton= (Button)findViewById(R.id.btn_disconnect); disconnectButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (Bluetooth.serviceOrCilent == ServerOrCilent.CILENT) { shutdownClient(); } else if (Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE) { shutdownServer(); } Bluetooth.isOpen = false; Bluetooth.serviceOrCilent=ServerOrCilent.NONE; Toast.makeText(mContext, "已断开连接!", Toast.LENGTH_SHORT).show(); } }); }

private Handler LinkDetectedHandler = new Handler() { @Override public void handleMessage(Message msg) { //Toast.makeText(mContext, (String)msg.obj, Toast.LENGTH_SHORT).show(); if(msg.what==1) { list.add(new deviceListItem((String)msg.obj, true)); } else { list.add(new deviceListItem((String)msg.obj, false)); } mAdapter.notifyDataSetChanged(); mListView.setSelection(list.size() - 1); } }; @Override public synchronized void onPause() { super.onPause(); } @Override public synchronized void onResume() { super.onResume(); if(Bluetooth.isOpen) { Toast.makeText(mContext, "连接已经打开,可以通信。如果要再建立连接,请先断开!", Toast.LENGTH_SHORT).show(); return; } if(Bluetooth.serviceOrCilent==ServerOrCilent.CILENT) { String address = Bluetooth.BlueToothAddress; if(!address.equals("null")) { device = mBluetoothAdapter.getRemoteDevice(address); clientConnectThread = new clientThread(); clientConnectThread.start(); Bluetooth.isOpen = true; } else { Toast.makeText(mContext, "address is null !", Toast.LENGTH_SHORT).show(); } } else if(Bluetooth.serviceOrCilent==ServerOrCilent.SERVICE) { startServerThread = new ServerThread(); startServerThread.start(); Bluetooth.isOpen = true; } } //开启客户端 private class clientThread extends Thread { public void run() { try { //创建一个Socket连接:只需要服务器在注册时的UUID号 // socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID); socket = device.createRfcommSocketToServiceRecord(UUID.fromString("----F9BFB")); //连接 Message msg2 = new Message(); msg2.obj = "请稍候,正在连接服务器:"&#;Bluetooth.BlueToothAddress; msg2.what = 0; LinkDetectedHandler.sendMessage(msg2); socket.connect(); Message msg = new Message(); msg.obj = "已经连接上服务端!可以发送信息。"; msg.what = 0; LinkDetectedHandler.sendMessage(msg); //启动接受数据 mreadThread = new readThread(); mreadThread.start(); } catch (IOException e) { Log.e("connect", "", e); Message msg = new Message(); msg.obj = "连接服务端异常!断开连接重新试一试。"; msg.what = 0; LinkDetectedHandler.sendMessage(msg); } } };

//开启服务器 private class ServerThread extends Thread { public void run() { try { /* 创建一个蓝牙服务器 * 参数分别:服务器名称、UUID */ mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM, UUID.fromString("----F9BFB")); Log.d("server", "wait cilent connect..."); Message msg = new Message(); msg.obj = "请稍候,正在等待客户端的连接..."; msg.what = 0; LinkDetectedHandler.sendMessage(msg); /* 接受客户端的连接请求 */ socket = mserverSocket.accept(); Log.d("server", "accept success !"); Message msg2 = new Message(); String info = "客户端已经连接上!可以发送信息。"; msg2.obj = info; msg.what = 0; LinkDetectedHandler.sendMessage(msg2); //启动接受数据 mreadThread = new readThread(); mreadThread.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; /* 停止服务器 */ private void shutdownServer() { new Thread() { public void run() { if(startServerThread != null) { startServerThread.interrupt(); startServerThread = null; } if(mreadThread != null) { mreadThread.interrupt(); mreadThread = null; } try { if(socket != null) { socket.close(); socket = null; } if (mserverSocket != null) { mserverSocket.close();/* 关闭服务器 */ mserverSocket = null; } } catch (IOException e) { Log.e("server", "mserverSocket.close()", e); } }; }.start(); } /* 停止客户端连接 */ private void shutdownClient() { new Thread() { public void run() { if(clientConnectThread!=null) { clientConnectThread.interrupt(); clientConnectThread= null; } if(mreadThread != null) { mreadThread.interrupt(); mreadThread = null; } if (socket != null) { try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } socket = null; } }; }.start(); } //发送数据 private void sendMessageHandle(String msg) { if (socket == null) { Toast.makeText(mContext, "没有连接", Toast.LENGTH_SHORT).show(); return; } try { OutputStream os = socket.getOutputStream(); os.write(msg.getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } list.add(new deviceListItem(msg, false)); mAdapter.notifyDataSetChanged(); mListView.setSelection(list.size() - 1); } //读取数据 private class readThread extends Thread { public void run() { byte[] buffer = new byte[]; int bytes; InputStream mmInStream = null; try { mmInStream = socket.getInputStream(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } while (true) { try { // Read from the InputStream if( (bytes = mmInStream.read(buffer)) > 0 ) { byte[] buf_data = new byte[bytes]; for(int i=0; i<bytes; i&#;&#;) { buf_data[i] = buffer[i]; } String s = new String(buf_data); Message msg = new Message(); msg.obj = s; msg.what = 1; LinkDetectedHandler.sendMessage(msg); } } catch (IOException e) { try { mmInStream.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } break; } } } } @Override protected void onDestroy() { super.onDestroy();

if (Bluetooth.serviceOrCilent == ServerOrCilent.CILENT) { shutdownClient(); } else if (Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE) { shutdownServer(); } Bluetooth.isOpen = false; Bluetooth.serviceOrCilent = ServerOrCilent.NONE; } public class SiriListItem { String message; boolean isSiri;

public SiriListItem(String msg, boolean siri) { message = msg; isSiri = siri; } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } @Override public void onClick(View arg0) { // TODO Auto-generated method stub } public class deviceListItem { String message; boolean isSiri;

public deviceListItem(String msg, boolean siri) { message = msg; isSiri = siri; } }}

下面是实现的效果。

1.Android手机通信

一台手机作为服务端,等待客服端链接。

另一台手机作为客户端,链接服务端,链接成功,发送数据

2.Android和蓝牙模块的通信

蓝牙模块作为服务器端,Android手机作为客户端,链接蓝牙模块。

蓝牙模块通过串口线链接PC,通过串口工具接收Android手机端发送数据,Android手机端链接成功信息CONNECTING<<A0:E4:::BB: CONNETED,链接成功发送信息hellokitty mina,Android链接断开信息DISC:SUCCESS &#;READY&#;PAIRABLE

&#;&#;

照片选择器 multiimageselector packagecom.me.nereo.multiimageselector;importandroid.content.Intent;importandroid.support.v7.app.ActionBarActivity;importandroid.os.Bundle;importandroid.text.TextUtils;importandroid.view.Menu;importan

Android 退出整个应用程序 三步走1、建立一个JAVA类importjava.util.LinkedList;importjava.util.List;importandroid.app.Activity;importandroid.app.Application;publicclassSysApplicationextendsApplication{privateListActivity

记录 "心跳机制" 相关问题 记录心跳机制相关问题论坛里碰到一个问题,记录一下。一、心跳分为两种,第一种是客户端发起的心跳,第二种是服务端发起的心跳。客户端发起的

标签: android蓝牙连接过程

本文链接地址:https://www.jiuchutong.com/biancheng/376615.html 转载请保留说明!

上一篇:Android内存分析工具(android profiler内存分析)

下一篇:照片选择器 multiimageselector(选择照片的快捷键)

  • 建筑业预缴企业所得税
  • 增值税专票怎么抵税
  • 其他应付款在借方资产负债表怎么填
  • 企业工商注销啥意思
  • 加计抵减怎么入账
  • 增值税一般纳税人证明怎么查询
  • 差旅费报销单属于什么凭证?
  • 应付职工薪酬如何填列
  • 在建工程工伤保险
  • 公司转让股权要去税务吗
  • 预计退货会计英语
  • 未取得正式发票怎么整改
  • 单位个人实际困难怎么写
  • 物业收取的滞纳金怎么算
  • 上月销项税额错了怎么修改凭证?
  • 餐饮发票忘记作废也没冲红怎么处理?
  • 销售库存商品的记账凭证
  • 进项票认证超了怎么处理
  • 护建设税和教育费附加?
  • 1697510605
  • 企业处置固定资产怎么纳税
  • 鸿蒙系统通知栏和控制
  • 车船税收费标准2023年多少钱
  • 企业备用金多久还款
  • 一个非常好看的中秋礼物怎么做
  • 微软即将终止当前系统版本
  • 股票发行费用怎么算
  • 销售无形资产增值税税率2022
  • php dicom
  • laravel搭建
  • 保险公司赔付进项税
  • mask rcnn优点
  • php写一个简单的单例模式
  • 应交增值税进项税额月底怎么处理
  • phpweb缓存技术
  • 图文详解管道支架制作安装标准
  • 分享使用护肤品的感受
  • 一般纳税人增值税税率
  • 年终汇算清缴所得税计算器
  • 奖金如何做账会计分录
  • 在mysql中设置事务保存点
  • 公司会计日常工作内容
  • 未分配利润为负数可以分红吗
  • 企业中间投入
  • 工会经费计提分录最新规定
  • 现金支付什么会计科目
  • 债务重组损失如何做会计分录
  • 其他债权投资的特征有哪些
  • 权益法下股权投资包括
  • 哪些费用不得计税
  • 本年利润在明细里怎么填
  • 计提了坏账准备就要计算递延所得税资产
  • 现金短缺无法查明计入什么科目
  • 商业保险的养老保险可靠吗
  • 未收到发票暂估分录
  • 企业研发费用怎么证明
  • 以销定产会计怎么做账科目
  • 个税返还开票什么项目
  • mac查找序列号
  • Linux Kernel 4.2下载 更新内容一览
  • vmware虚拟机无法打开内核设备怎么办
  • 系统32位和64位的区别 Windows系统32位和64位的区别在哪里
  • wins资源管理器
  • ubuntu怎么切换桌面
  • win8启动文件夹在哪里
  • linux系统百科
  • 右键无法新建wps
  • win7 win8 win8.1
  • win1020h2累积更新
  • win7退出家庭组
  • linux新增lv
  • 安装WIN10系统后怎么调过设置
  • cocos2dx 3.5 ”hello world“解析
  • unity中mathf
  • node.js的流的作用
  • qt配置opengl
  • android图片库
  • dos批处理文件的扩展名
  • nodejs操作mysql数据库
  • 浏览器兼容性问题是什么意思
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设