怎么读取Android的蓝牙接收到的数据

怎么读取Android的蓝牙接收到的数据,第1张

打开 蓝牙 打开 发现 (一般安卓蓝牙都要打开发现 除非之前配对过)或许有些机子会不能接收或发送特殊格式“如:apk格式”你可以在后面加"MP3" 变成 MP3格式这样就能发送了收到之后把名字"MP3"去掉这样会变回之前的apk格式就能安装了

Android 开发SPP经典蓝牙。

1、传统蓝牙采用的是SPP(Serial Port Profile)协议进行数据传输。

2、SPP的UUID:00001101-0000-1000-8000-00805F9B34FB

3、手机一般以客户端的角色主动连接SPP协议设备

概念:

BluetoothAdapter:

本地蓝牙适配器,是所有蓝牙交互的入口,表示蓝牙设备自身的一个蓝牙适配器,整个系统只有一个蓝牙适配器,通过他可以发现其他蓝牙设备,查询绑定(配对)设备列表,使用MAC地址实例化BluetoothDevice以及创建BluetoothServerSocket用来侦听来自其他设备的通信。

myBluetoothAdapter = BluetoothAdaptergetDefaultAdapter();//获取默认的蓝牙Adapter

BluetoothDevice:

远程的蓝牙设备。

private static BluetoothDevice myDevice;

myDevice = myBluetoothAdaptergetRemoteDevice(BDAddr);//获取远程设备,通过蓝牙的MAC地址来获取一个远程对象

两种连接方式

BluetoothSocket

客户端:调用BluetoothDevice的createRfcommSocketToServiceRecord()可以获取该对象;调用connect()方法可以建立连接。

private static BluetoothSocket mySocket = null;

private static final UUID SPP_UUID = UUIDfromString("00001101-0000-1000-8000-00805F9B34FB");

Method m = myDevicegetClass()getMethod("createRfcommSocket", new Class[] {intclass});//由BluetoothDevice衍生出BluetoothSocket, createRfcommSocket来选择连接的服务和协议

mySocket = (BluetoothSocket) minvoke(myDevice, 1);

BluetoothServerSocket:

服务端:通过BluetoothServerSocket对象可以创建BluetoothSocket对象,调用BluetoothServerSocket的accept()的方法可以得到改对象。

开发流程:

1:声明权限:

<uses-permission android:name="androidpermissionBLUETOOTH"/>

<uses-permission android:name="androidpermissionBLUETOOTH_ADMIN"/>

2:启动和关闭蓝牙

获取蓝牙适配器,使用close()接口可以关闭蓝牙适配器

myBluetoothAdapter = BluetoothAdaptergetDefaultAdapter();//获取默认的蓝牙Adapter

启动蓝牙

if (!blueadapterisEnabled())

        //判断本机蓝牙是否打开

        {//如果没打开,则打开蓝牙

        blueadapterenable();

        }

3使用BlueAdatper搜索 

使用bluetoothAdapter搜索设备,bluetoothAdapterstartDiscovery()在搜索过程中,系统会发出三个广播信息: 

ACTION_DISCOVERY_START:开始搜索 

ACTION_DISCOVERY_FINISHED:搜索结束 

ACTION_FOUND:找到设备

if (bluetoothAdapterisDiscovering()) {

        bluetoothAdaptercancelDiscovery();//如果蓝牙设备未连接则取消搜索

    }

    bluetoothAdapterstartDiscovery();

}

4:(1)通过注册广播获取搜索到的设备。

IntentFilter intentFilter = new IntentFilter();

intentFilteraddAction(BluetoothDeviceACTION_FOUND);//找到设备广播

intentFilteraddAction(BluetoothAdapterACTION_DISCOVERY_FINISHED);//搜索完成广播

registerReceiver(receiver, intentFilter);//注册广播接收器

// receiver

private final BroadcastReceiver receiver = new BroadcastReceiver(){

    @Override

    public void onReceive(Context context, Intent intent) {

        String action = intentgetAction();

        if (BluetoothDeviceACTION_FOUNDequals(action)) {

            // find a device

            BluetoothDevice device = intent getParcelableExtra(BluetoothDeviceEXTRA_DEVICE);

            if (devicegetBondState() != BluetoothDeviceBOND_BONDED) {

                //未配对设备

                newDeviceArrayAdapteradd(devicegetName() + "\n" + devicegetAddress());

            }else {

                //已经配对过的设备

                TextView tvPaired = (TextView)findViewById(Ridtv_paired);

                tvPairedsetVisibility(ViewVISIBLE);

                lvPairedDevicessetVisibility(ViewVISIBLE);

                pairedDeviceArrayAdapteradd(devicegetName() + "\n" + devicegetAddress());

            }

            Logi(TAG,"name:" + devicegetName() + " address"+ devicegetAddress());

        } else if (BluetoothAdapterACTION_DISCOVERY_FINISHEDequals(action){

            // search finish

            Logi(TAG, "search finish!");

        }

    }

};

(2),直接得到当前的蓝牙设备后,就可用通过遍历pairedDevices ,得到当前手机已经配对过的蓝牙设备。

Set<BluetoothDevice> pairedDevices = myBluetoothAdaptergetBondedDevices();//获取当前蓝牙设备

if (pairedDevicessize() <= 0) return false;

for (BluetoothDevice device : pairedDevices) {

    Map<String, String> map = new HashMap<String, String>();

    mapput("DeviceName", devicegetName());

    mapput("BDAddress", devicegetAddress());

    listadd(map);

5建立连接

private static final UUID SPP_UUID = UUIDfromString("00001101-0000-1000-8000-00805F9B34FB");

Method m = myDevicegetClass()getMethod("createRfcommSocket", new Class[] {intclass});//由BluetoothDevice衍生出BluetoothSocket, createRfcommSocket来选择连接的服务和协议

mySocket = (BluetoothSocket) minvoke(myDevice, 1);

mySocketconnect();//使用BluetoothSocket来连接设备

6把得到的蓝牙设备给通过点击ListView选择设备。

listViewsetOnItemClickListener(new ListViewOnItemClickListener() {

    public void onItemClick(AdapterView<> arg0, View arg1, int arg2, long arg3) {

        SelectedBDAddress = listget(arg2)get("BDAddress");

        if (((ListView) arg0)getTag() != null) {

            ((View) ((ListView) arg0)getTag())setBackgroundDrawable(null);

        }

        ((ListView) arg0)setTag(arg1);

        arg1setBackgroundColor(ColorBLUE);

        myDevice = myBluetoothAdaptergetRemoteDevice(SelectedBDAddress);

    }

});

7客户端发送数据

当两个设备成功连接之后,双方都会有一个BluetoothSocket对象,这时,就可以在设备之间传送数据了。

       1使用getOutputStream()方法来获取输出流来处理传输。

       2调用write()。

os = socketgetOutputStream();//获取输出流

if (os != null) {//判断输出流是否为空

    oswrite(messagegetBytes("UTF-8"));

}

osflush();//将输出流的数据强制提交

osclose();//关闭输出流

}

将输出流中的数据提交后,要记得关闭输出流,否则,可能会造成只能发送一次数据。

8服务端接收数据

1使用getInputStream()方法来获取输入流来处理传输。

       2调用read()。

InputStream im=null;

im=bluetoothSocketgetInputStream();

byte buf[] = new byte[1024];

if (is != null) {

    isread(buf, 0, buflength);//读取发来的数据

    String message = new String(buf);//把发来的数据转化为String类型

    BuletoothMainActivityUpdateRevMsg(message);//更新信息在显示文本框

    isclose();//关闭输入流

使用服务端接收数据时,要先从客户端向服务端发起连接,只有接收到连接请求之后,才会返回一个BluetoothSocket对象。有BluetoothSocket对象才能获取到输入流。

我这边举个例子吧:

在布局中拖入一个ListView空间,假如id就叫listView1;

在layout文件夹中,新建一个布局xml文件,假如叫items,可以选择RelativeLayout布局;里面放一个TextView,假如id是textView1(该布局就是ListView每一行的布局);

下面的例子中,可以把容器中的String换成自定义的类:

package comexampletest;

import javautilArrayList;

import androidappActivity;

import androidosBundle;

import androidviewMenu;

import androidviewView;

import androidviewViewGroup;

import androidwidgetAdapterView;

import androidwidgetAdapterViewOnItemClickListener;

import androidwidgetBaseAdapter;

import androidwidgetListView;

import androidwidgetTextView;

import androidwidgetToast;

public class MainActivity extends Activity {

private ArrayList<String> btList = new ArrayList<String>(); // 用于保存获取到的蓝牙名称

private MyAdapter mAdapter; // 适配器

@Override

protected void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutactivity_main);

initData();

initListView();

// 若蓝牙列表数据更新后,可以用以下方法通知ListView更新显示

mAdapternotifyDataSetChanged();

}

/

  初始化数据

 /

private void initData() {

// 假如在这里添加蓝牙设备到ArrayList

// 假如列表中有数据,先清空

btListclear();

for (int i = 0; i < 10; i++) {

btListadd("蓝牙" + i);

}

}

/

  初始化ListView

 /

private void initListView() {

ListView listView = (ListView) findViewById(RidlistView1);

// 为ListView设置适配器

mAdapter = new MyAdapter();

listViewsetAdapter(mAdapter);

listViewsetOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<> parent, View view,

int position, long id) {

// 在这里对点击事件进行

// position是当前点击的行;根据它可以获得容器中对应的值

String btName = btListget(position);

ToastmakeText(MainActivitythis, "当前点击的是:" + btName,

ToastLENGTH_SHORT)show();

}

});

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater()inflate(Rmenumain, menu);

return true;

}

class MyAdapter extends BaseAdapter {

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View inflate = getLayoutInflater()inflate(Rlayoutitem, null);

TextView textView = (TextView) inflatefindViewById(RidtextView1);// 查找item中的textView

String btName = btListget(position);

textViewsetText(btName);

return inflate;

}

@Override

public int getCount() {

// 决定ListView的行数,这里设成容器内容数

return btListsize();

}

@Override

public Object getItem(int position) {

return null;

}

@Override

public long getItemId(int position) {

return 0;

}

}

}

你可以试一下蓝牙连接方法大体详细步骤是:

1、首先手机、车载蓝牙设备要建立配对关系。分别开启手机、车载蓝牙设备的蓝牙功能,并将手机蓝牙设置中设为所有人可见。

2、然后在手机中搜索蓝牙设备,查找到之后选中进行配对连接,配对密码为:0000,完成配对后则连接成功。

3、车载蓝牙与手机蓝牙配对连接成功后,可以拨打和接听电话;在手机上播放音乐,可在车载蓝牙设备上欣赏音乐。

4、找到音频项找到蓝牙音频再按就是蓝牙音频装置列表,此时用手机一搜就见MB Bluetooth 了。

扩展资料:

车载蓝牙只是以无线蓝牙技术为基础而设计研发的车内无线免提系统,主要功能是为在正常行驶中用蓝牙技术与手机连接进行免提通话,以达到解放双手、降低交通肇事隐患的目的。

使用蓝牙API,可以做到:搜索蓝牙设备从本地的Bluetoothadapter中查询已经配对的设备建立RFCOMM通道通过servicediscovery连接到其它设备在设备之间传输数据管理多个连接基础知识:主要包含四个部分:蓝牙设置、搜索设备(配对的或可见的)、连接、传输数据。所有的蓝牙API在androidbluetooth包中。实现这些功能主要需要下面这几个类和接口:BluetoothAdapter代表本地蓝牙适配器(蓝牙发射器),是所有蓝牙交互的入口。通过它可以搜索其它蓝牙设备,查询已经配对的设备列表,通过已知的MAC地址创建BluetoothDevice,创建BluetoothServerSocket监听来自其它设备的通信。BluetoothDevice代表了一个远端的蓝牙设备,使用它请求远端蓝牙设备连接或者获取远端蓝牙设备的名称、地址、种类和绑定状态。(其信息是封装在bluetoothsocket中)。BluetoothSocket代表了一个蓝牙套接字的接口(类似于tcp中的套接字),他是应用程序通过输入、输出流与其他蓝牙设备通信的连接点。BluetoothServerSocket代表打开服务连接来监听可能到来的连接请求(属于server端),为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。当远端设备发起连接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket类将会返回一个bluetoothsocket。BluetoothClass描述了一个设备的特性(profile)或该设备上的蓝牙大致可以提供哪些服务(service),但不可信。比如,设备是一个电话、计算机或手持设备;设备可以提供audio/telephony服务等。可以用它来进行一些UI上的提示。BluetoothProfileBluetoothHeadset提供手机使用蓝牙耳机的支持。这既包括蓝牙耳机和免提(V15)模式。BluetoothA2dp定义高品质的音频,可以从一个设备传输到另一个蓝牙连接。“A2DP的”代表高级音频分配模式。BluetoothHealth代表了医疗设备配置代理控制的蓝牙服务BluetoothHealthCallback一个抽象类,使用实现BluetoothHealth回调。你必须扩展这个类并实现回调方法接收更新应用程序的注册状态和蓝牙通道状态的变化。BluetoothHealthAppConfiguration代表一个应用程序的配置,蓝牙医疗第三方应用注册与远程蓝牙医疗设备交流。BluetoothProfileServiceListener当他们已经连接到或从服务断开时通知BluetoothProfileIPX的客户时一个接口(即运行一个特定的配置文件,内部服务)。

android 从60开始,通过BluetoothAdaptergetDefaultAdapter()getAddress()获取的地址是一个固定值02:00:00:00:00:00。60已经对蓝牙Wi-Fi的MAC地址做了隐藏。

以下方法能正确的获取android自带蓝牙的Mac地址:

1添加netvidageek:mirror:161

2实现过程

本人也尝试过其他方法获取,比如从cat /sys/class/net/wlan0/address 或者/sys/class/net/eth0/address路径获取,该方式有些手机能获取得到,有的不能或缺,获取到的Mac 地址还不一定准确。

以上就是关于怎么读取Android的蓝牙接收到的数据全部的内容,包括:怎么读取Android的蓝牙接收到的数据、android开发SPP经典蓝牙、请问在android开发中怎样将蓝牙搜索的设备放在ListView中呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9701717.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存