Android 蓝牙 MAC 地址的读取和修改

蓝牙地址的 NV 项是 447 项,蓝牙地址一般从 NV 读取,所以连接上 QXDM,修改 NV447 项就可以修改蓝牙的MAC地址。

最近在高通 QCM6125 平台上,通过 QXDM 修改 BT MAC(NV 447)的时候,发现可以成功修改,但是系统设置-关于手机里的蓝牙address 显示并没有变化,因此怀疑蓝牙 MAC 读取的时候并没有去 NV447 里读取,于是搜索资料看代码发现问题:没有设置 persist.vendor.bluetooth.modem_nv_support 属性,通过设置该属性为 true 可解决。

device/qcom/qssi/system.prop

#set reading BT MAC from NV

persist.vendor.bluetooth.modem_nv_support=true

1. 蓝牙mac地址格式

蓝牙设备地址(BD_ADDR)是一个48bit的唯一标识符,由LAP(24位地址低端部分)、UAP(8位地址高端部分)和NAP(16位无意义地址部分)组成,其格式如下所示:

          LSB                                                       MSB
          |0000 0001 0000 0000 0000 0000|0001 0010|0111 1011 0011 0101|
          |<----------(24bit)---------->|<( 8bit)>|<----+(16bit)+---->|
          |             LAP             |   UAP   |        NAP        |

NAP和UAP是蓝牙设备生产厂商的唯一标识码,由SIG分配给各个厂商;LAP则由厂商自行分配。

其中,bit40为组播地址标志位,其值为0:unicast(单播),其值为1:multicast(组播);bit

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 Android 通信代码示例: 首先,你需要在你的 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> ``` 然后,你需要在你的 Activity 中实现通信的逻辑。示例代码如下: ```java import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import androidx.appcompat.app.AppCompatActivity; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; public class BluetoothActivity extends AppCompatActivity { // 适配器 BluetoothAdapter mBluetoothAdapter; // 设备 BluetoothDevice mBluetoothDevice; // 套接字 BluetoothSocket mBluetoothSocket; // 输入流 InputStream mInputStream; // 输出流 OutputStream mOutputStream; // 读取的数据 String mReadData; // 读取数据的线程 ReadThread mReadThread; // 服务端 UUID UUID mServerUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); Button mConnectButton; Button mSendButton; EditText mEditText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bluetooth); mConnectButton = findViewById(R.id.connect_button); mSendButton = findViewById(R.id.send_button); mEditText = findViewById(R.id.edit_text); mConnectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 检查是否支持 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { Log.e("BluetoothActivity", "设备不支持"); return; } // 检查是否已开启 if (!mBluetoothAdapter.isEnabled()) { Log.e("BluetoothActivity", "未开启"); return; } // 获取设备 mBluetoothDevice = mBluetoothAdapter.getRemoteDevice("设备的 MAC 地址"); try { // 创建套接字 mBluetoothSocket = mBluetoothDevice.createRfcommSocketToServiceRecord(mServerUUID); // 连接设备 mBluetoothSocket.connect(); // 获取输入流 mInputStream = mBluetoothSocket.getInputStream(); // 获取输出流 mOutputStream = mBluetoothSocket.getOutputStream(); // 启动读取数据的线程 mReadThread = new ReadThread(); mReadThread.start(); } catch (IOException e) { e.printStackTrace(); } } }); mSendButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 发送数据 String sendData = mEditText.getText().toString(); try { mOutputStream.write(sendData.getBytes()); } catch (IOException e) { e.printStackTrace(); } } }); } // 读取数据的线程 class ReadThread extends Thread { @Override public void run() { byte[] buffer = new byte[1024]; int bytes; while (true) { try { // 读取数据 bytes = mInputStream.read(buffer); mReadData = new String(buffer, 0, bytes); // 将读取的数据发送给主线程处理 mHandler.obtainMessage(1, mReadData).sendToTarget(); } catch (IOException e) { e.printStackTrace(); break; } } } } // 处理读取到的数据 Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { switch (msg.what) { case 1: // 显示读取到的数据 String readData = (String) msg.obj; Log.d("BluetoothActivity", "读取到的数据:" + readData); break; } return false; } }); } ``` 在上面的代码中,我们使用 BluetoothAdapter 类来获取适配器,使用 BluetoothDevice 类来获取设备,使用 BluetoothSocket 类来创建和连接套接字,使用 InputStream 和 OutputStream 类来读取和发送数据。同时,我们还创建了一个 ReadThread 线程来持续读取设备发送过来的数据,并使用 Handler 回调来处理读取到的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值