as实现安卓蓝牙通信

1.布局

基于前期的wechat中的tab01.xml进行添加,使其拥有对话框的控件。添加的代码如下:

<!--新版Android支持的Toolbar,对标题栏布局-->
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/title_left_text"
            style="?android:attr/windowTitleStyle"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:layout_weight="1"
            android:gravity="left"
            android:ellipsize="end"
            android:singleLine="true" />
        <TextView
            android:id="@+id/title_right_text"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_alignParentRight="true"
            android:layout_weight="1"
            android:ellipsize="end"
            android:gravity="right"
            android:singleLine="true"
            android:textColor="#fff" />
    </LinearLayout>
</android.support.v7.widget.Toolbar>

2.蓝牙通信的具体实现

这里需要用到UUID,UUID:通用唯一识别码,是一个128位长的数字,一般用十六进制表示,它主要是通过结合机器的网卡、当地时间、一个随机数来生成,不会重复。还需要用到蓝牙的基本类BluetoothAdapter类。

(1)书写构造方法,接收UI主线程传递的对象
public ChatService(Context context, Handler handler) {
    //构造方法完成蓝牙对象的创建
    mAdapter = BluetoothAdapter.getDefaultAdapter();
    mState = STATE_NONE;
    mHandler = handler;
}
(2)使用多线程,取消 CONNECTING 和 CONNECTED 状态下的相关线程,然后运行新的 mConnectThread 线程
public synchronized void connect(BluetoothDevice device) {
    if (mState == STATE_CONNECTING) {
        if (mConnectThread != null) {
            mConnectThread.cancel();
            mConnectThread = null;
        }
    }
    if (mConnectedThread != null) {
        mConnectedThread.cancel();
        mConnectedThread = null;
    }
    mConnectThread = new ConnectThread(device);
    mConnectThread.start();
    setState(STATE_CONNECTING);
}
(3)管理蓝牙的连接,使用socket套接字
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) {
    if (mConnectThread != null) {
        mConnectThread.cancel();
        mConnectThread = null;
    }
    if (mConnectedThread != null) {
        mConnectedThread.cancel();
        mConnectedThread = null;
    }
    if (mAcceptThread != null) {
        mAcceptThread.cancel();
        mAcceptThread = null;
    }
    mConnectedThread = new ConnectedThread(socket);
    mConnectedThread.start();
    Message msg = mHandler.obtainMessage(weixinFragment.MESSAGE_DEVICE_NAME);
    Bundle bundle = new Bundle();
    bundle.putString(weixinFragment.DEVICE_NAME, device.getName());
    msg.setData(bundle);
    mHandler.sendMessage(msg);
    setState(STATE_CONNECTED);
}
(4)对连接状态发生改变进行处理

连接失败的时候和当连接失去的时候,通知 ui,设置STATE_LISTEN 状态

private void connectionLost() {
    setState(STATE_LISTEN);
    Message msg = mHandler.obtainMessage(weixinFragment.MESSAGE_TOAST);
    Bundle bundle = new Bundle();
    bundle.putString(weixinFragment.TOAST, "设备链接中断");
    msg.setData(bundle);
    mHandler.sendMessage(msg);
}

3.通信实现的思路

首先在构造函数里通过BluetoothDevice
.createRfcommSocketToServiceRecord() ,从待连接的 device 产生 BluetoothSocket. 然后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关socket ,对外发出连接对方蓝牙的请求。双方蓝牙连接后,构造函数中设置输入输出流。run()方法中使用阻塞模式的 InputStream.read()循环读取输入流,然后发送到 UI 线程中更新聊天消息。大概的思路就是这样。主要是能熟练运用线程和socket套接字。

4.附上源码 https://github.com/echo1923944075/MyWechat.git.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是Python代码实现蓝牙通信和OBEX协议的示例: ```python import bluetooth from bluetooth import * import obexftp # 定义设备地址 target_name = "设备名" target_address = None # 扫描周围的蓝牙设备 nearby_devices = bluetooth.discover_devices() # 在已发现的设备列表中寻找目标设备 for address in nearby_devices: if target_name == bluetooth.lookup_name(address): target_address = address break # 如果找到目标设备,则进行 OBEX 文件传输 if target_address is not None: print("找到目标设备:", target_name) # 连接到目标设备 port = 9 # RFCOMM 端口号 sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) sock.connect((target_address, port)) # 初始化 OBEX FTP 客户端 obex_client = obexftp.client(obexftp.BLUETOOTH, sock) # 将本地文件上传到目标设备 local_file = "本地文件路径" remote_file = "目标设备文件路径" obex_client.put(local_file, remote_file) # 关闭连接 obex_client.disconnect() sock.close() print("文件传输完成") else: print("未找到目标设备") ``` 需要注意的是,该示例中使用了`bluetooth`和`obexftp`两个Python库来实现蓝牙通信和OBEX协议。在使用前需要确保已经正确安装这两个库。 ### 回答2: 要使用Python实现蓝牙通信和OBEX协议,可以使用PyBluez库和PyOBEX库。PyBluez是一个用于Python的蓝牙编程接口,它提供了与蓝牙设备进行通信的功能。PyOBEX是一个用于Python的OBEX(对象交换协议)库,它实现了OBEX客户端和服务器端。 首先,需要安装PyBluez和PyOBEX库。可以使用pip命令在命令行中安装这些库。 在使用Python实现蓝牙通信时,首先需要使用PyBluez库来扫描附近的蓝牙设备、连接到蓝牙设备以及与蓝牙设备进行通信。以下是一个简单的示例代码: ```python import bluetooth # 扫描附近的蓝牙设备 devices = bluetooth.discover_devices() for device in devices: print("发现设备:", bluetooth.lookup_name(device)) # 连接到蓝牙设备 target_addr = '00:11:22:33:AA:BB' # 目标设备的蓝牙地址 sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) sock.connect((target_addr, 1)) # 发送数据 sock.send("Hello, Bluetooth!") # 接收数据 data = sock.recv(1024) print("收到数据:", data) # 关闭连接 sock.close() ``` 接下来,使用PyOBEX库实现OBEX协议通信。OBEX是一种用于在蓝牙设备之间传输对象的协议,它包含了一些标准操作,如连接、断开连接、发送文件等等。以下是一个简单的示例代码: ```python import obex # 连接OBEX服务器 client = obex.OBEXClient(target_addr) # 发送文件 filename = 'example.txt' with open(filename, 'rb') as file: client.put(filename, file.read()) # 获取文件 response = client.get(filename) if response.code == obex.OBEXResponse.OK: with open(filename, 'wb') as file: file.write(response.read()) # 关闭连接 client.close() ``` 通过结合使用PyBluez和PyOBEX库,可以实现蓝牙通信和OBEX协议的功能。请根据实际需求进行相应的调整和修改。 ### 回答3: 实现蓝牙通信和OBEX协议的Python代码可以使用第三方库`PyBluez`来实现。PyBluez是Python语言的一个蓝牙开发库,提供了蓝牙设备发现、配对、连接和通信等功能。 下面是一个使用PyBluez实现蓝牙通信和OBEX协议的简单示例代码: ```python import bluetooth # 搜索和连接蓝牙设备 def connect_bluetooth(): nearby_devices = bluetooth.discover_devices() for addr in nearby_devices: name = bluetooth.lookup_name(addr) if name == '设备名': target_device_addr = addr break else: print("未找到目标设备") return # 连接蓝牙设备 sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) sock.connect((target_device_addr, 1)) return sock # 使用OBEX协议发送数据 def send_data(sock, data): obex_headers = b"\x05" + (len(data)).to_bytes(2, byteorder='big') sock.send(obex_headers + data) received_data = sock.recv(1024) return received_data # 主函数 def main(): # 连接蓝牙设备 sock = connect_bluetooth() if not sock: return # 使用OBEX协议发送数据 data = b"Hello, World!" received_data = send_data(sock, data) print("接收到的数据:", received_data) # 关闭连接 sock.close() if __name__ == '__main__': main() ``` 以上代码通过蓝牙设备的发现和连接功能,找到目标设备并进行连接。然后,使用OBEX协议发送数据,并接收到返回的数据。在代码示例中,我们使用了蓝牙设备名来确定目标设备,根据实际情况可以进行相应的修改。 请注意,使用PyBluez库需要提前安装,可以通过`pip install pybluez`命令来进行安装。另外,代码中的蓝牙通信部分可能需要根据目标设备的具体协议进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值