RK3568蓝牙程序开发过程

1、搭建蓝牙开发环境

     蓝牙开发可以使用C语言开发或python语言开发,使用的是蓝牙开发库为bluez库。

     本文开发使用python语言开发,安装bluez库,可以使用pip install PyBluez来安装。

      如果安装不上的话,可以使用sudo apt install python3-bluez来安装。

      安装成功后可以通过pip list来查看一下是否安装成功。如下看到PyBluez 0.22表示安装成功了。

firefly@firefly:/usr/lib/bluetooth$ pip list
Package                Version             
---------------------- --------------------
attrs                  23.1.0              
blinker                1.4                 
certifi                2023.7.22           
chardet                3.0.4               
command-not-found      0.3                 
cryptography           2.8                 
dbus-python            1.2.16              
distro                 1.4.0               
entrypoints            0.3                 
exceptiongroup         1.1.2               
h11                    0.14.0              
httplib2               0.14.0              
idna                   2.8                 
keyring                18.0.1              
launchpadlib           1.10.13             
lazr.restfulclient     0.14.2              
lazr.uri               1.0.3               
netifaces              0.10.4              
oauthlib               3.1.0               
onboard                1.4.1               
outcome                1.2.0               
pip                    20.0.2              
PyBluez                0.22                
pycairo                1.16.2              
PyGObject              3.36.0              
PyJWT                  1.7.1               
PyQt5                  5.14.1              
PySocks                1.7.1               
python-apt             2.0.0+ubuntu0.20.4.8
PyYAML                 5.3.1               
requests               2.22.0              
requests-unixsocket    0.2.0               
SecretStorage          2.3.1               
selenium               4.10.0              
setuptools             45.2.0              
simplejson             3.16.0              
sip                    4.19.21             
six                    1.14.0              
sniffio                1.3.0               
sortedcontainers       2.4.0               
ssh-import-id          5.10                
trio                   0.22.2              
trio-websocket         0.10.3              
ubuntu-advantage-tools 27.10               
urllib3                1.21.1              
wadllib                1.3.3               
wheel                  0.34.2              
wsproto                1.2.0       

2、建立蓝牙服务端程序

       蓝牙的程序编写与tcp/ip协议很像,基于socket进行编程的。所以有客户端与服务器的角色。服务器的程序代码如下,代码在服务器端建立一个zsm-server的服务器,对应的uuid为00001101-0000-1000-8000-00805F9B34FC。服务端程序运行在设备A上面。

#! /usr/bin/python3.8
import bluetoothserver_sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
server_sock.bind(("", bluetooth.PORT_ANY))
server_sock.listen(1)port = server_sock.getsockname()[1]uuid = "00001101-0000-1000-8000-00805F9B34FC"bluetooth.advertise_service(server_sock, "zsm-service", uuid)print("Waiting for connection on RFCOMM channel %d" % port)client_sock, client_info = server_sock.accept()
print("Accepted connection from ", client_info)while True:data = client_sock.recv(1024)print("Received ", data)client_sock.send(data)client_sock.close()
server_sock.close()

       运行时发现程序报错,报错的函数为bluetooth.advertise_service(server_sock, "zsm-service", uuid), 报错的内容为(2, 'No such file or directory')。

      经过分析与百度,查找到的解决办法为蓝牙服务启动时需要增加-E -C的选项。解决办法参考:树莓派-蓝牙

         

  bluetoothd -E -C 是蓝牙守护进程(bluetoothd)运行时的命令行选项。下面是每个选项的功能:

  • -E:此选项启用扩展模式。在扩展模式下,蓝牙守护进程将提供更多的功能和调试选项。这些功能包括支持调试输出、启用 experimental 模式、允许加载外部插件和驱动程序等。

  • -C:此选项指定了蓝牙守护进程的配置文件路径。在默认情况下,配置文件是在/etc/bluetooth/main.conf。使用-C选项可以指定一个不同的配置文件路径,让蓝牙守护进程使用自定义的配置文件。

3、建立蓝牙客户端程序

      客户端的程序相对简单一些,客户端程序如下所示,运行在设备B上面。

#! /usr/bin/python3.8
# -*- coding: utf-8 -*-
import bluetooth
from bluetooth import *
import timenearby_devices = bluetooth.discover_devices(duration=10, lookup_names=True)
print("Found %d devices" % len(nearby_devices), nearby_devices)con_addr = ""
con_name = "WL18xx Device"
for addr, name in nearby_devices:print("Find bluetooth device  %s - %s" % (addr, name))if name == con_name:services = bluetooth.find_service(address=addr)for svc in services:print("Service Name: %s"    % svc["name"])print("    Host:        %s" % svc["host"])print("    Description: %s" % svc["description"])print("    Provided By: %s" % svc["provider"])print("    Protocol:    %s" % svc["protocol"])print("    channel/PSM: %s" % svc["port"])print("    svc classes: %s "% svc["service-classes"])print("    profiles:    %s "% svc["profiles"])print("    service id:  %s "% svc["service-id"])print("\n")con_addr = addrif con_addr == "":print("not find!")
else:    # Create the client socketclient_socket=BluetoothSocket( RFCOMM )client_socket.connect((con_addr, 3))print("connect the device:%s addr:%s"%(con_name, con_addr))client_socket.send("Hello World")print("Finished")while True:time.sleep(1)client_socket.close()

4、测试蓝牙通信

      先启动设备A的服务器程序,再启动设备B的客户端程序,如果一切正常的话,设备B会收到发送出去的数据,再接收到服务器返回来的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka与Zookeeper版本对应关系

文章目录 了解版本对应Kafka安装包Kafka源码包 了解 比如: kafka_2.11-1.1.1.jar包 其中2.11表示的是Scala的版本,因为Kafka服务器端代码完全由Scala语音编写。”-“后面的1.1.1表示的kafka的版本信息。遵循一个基本原则,Kafka客户端版本和服…

无涯教程-Perl - getnetbyname函数

描述 此函数返回由NAME指定的网络信息(在列表context中)($name,$aliases,$addrtype,$net) 语法 以下是此函数的简单语法- getnetbyname NAME返回值 此函数在错误时返回undef,否则在标量context中返回网络地址,在错误时返回空列表,否则在列表context中返回网络记录(名称,别…

pandas 笔记 date_range

返回固定频率下的datetime 1 使用方法 pandas.date_range(startNone, endNone, periodsNone, freqNone, tzNone, normalizeFalse, nameNone, inclusiveboth, *, unitNone, **kwargs) 2 基本参数 start、end、periods至少需要两个 start生成日期的左边界end生成日期的右边界…

错误: XXXAdapter不是抽象的, 并且未覆盖Adapter中的抽象方法onBindViewHolder(ViewHolder,int)

一、问题描述 在学习Android可侧滑删除的RecyclerView的时候,遇到了下面的报错 错误: SwipeDelAdapter不是抽象的, 并且未覆盖Adapter中的抽象方法onBindViewHolder(ViewHolder,int) public class SwipeDelAdapter extends RecyclerView.Adapter { ^ 在上面的…

java springboot word文档转pdf

java springboot word文档转pdf 1、环境2、依赖3、代码 1、环境 1、java、springboot 2、maven或者gradle 3、办公软件(自己电脑上的wps或者office等,如果部署到服务器上也要安装,linux、Mac 都有,自己安装) 可能会遇…

用zabbix实现web监控

上篇我们说到了用最简单的web页面监控,如果你的页面只有ip和port就可以访问的话,那么简单的监测没有问题了。如果……开发给你的网站在后边加了个目录呢?那么就绕不开了web场景监控了。 一、添加模板 在【模板】上新建一个模板,…

操作系统—调度算法

进程调度算法 进程调度算法也称CPU调度算法 调度发生时期 当进程从运行状态转到等待状态;当进程从运行状态转到就绪状态;当进程从等待状态转到就绪状态;当进程从运行状态转到终止状态; 其中发生在 1 和 4 两种情况下的调度称为…

[QCM6125][Android13] 关闭救援模式

文章目录 开发平台基本信息问题描述解决方法 开发平台基本信息 芯片: QCM6125 版本: Android 13 kernel: msm-4.14 问题描述 安装系统在未响应5分钟的时候,系统会自动进入救援模式,这时候需要通过音量键和电源键进行操作才能再次进入系统。对于无人值…

物理层扩展以太网

扩展站点与集线器之间的距离:   在10BASE-T星型以太网中,可使用光纤和一对光纤调制解调器来扩展站点与集线器之间的距离。   为站点和集线器各增加一个用于电信号和光信息号转换的光纤调制解调器,以及他们之间的通信光纤。 扩展共享式以太…

Unity开发笔记:截取指定位置含有UI的场景截图并输出

学习记录整理,自用,也希望能帮助到有相同需求的人。 如果直接截全图: string screenshotName "Assets/Textures/UI/20230803/2.png";ScreenCapture.CaptureScreenshot(screenshotName);截取指定位置含有UI的场景截图: …

uniapp input输入框placeholder文本右对齐

input输入框placeholder文本右对齐 给input标签加上placeholder-class,这个是给placeholder设置样式,右对齐这就是text-align:right;字体颜色之类依次编辑即可。

flutter开发实战-TextPainter计算文本内容的宽度

flutter开发实战-TextPainter计算文本内容的宽度 最近开发过程中根据Text文本的大小判断是否需要进行显示跑马灯效果,获取文本的大小,需要TextPainter来获取Size 一、TextPainter TextPainter主要用于实现文本的绘制。TextPainter类可以将TextSpan渲染…

Babylon.js着色器简明简称【Shader】

推荐:用 NSDT设计器 快速搭建可编程3D场景 为了生成 BabylonJS 场景,需要用 Javascript 编写代码,BabylonJS 引擎会处理该代码并将结果显示在屏幕上。 场景可以通过改变网格、灯光或摄像机位置来改变。 为了及时显示可能的变化,屏…

JS实现数组扁平化的 8 种方式

八种数组扁平化方法的使用场景和优缺点 以下是八种数组扁平化方法的使用场景和优缺点: 1. 使用递归: 使用场景:当需要对任意层级的嵌套数组进行扁平化时,递归是一种简单且通用的方法。优点:简单易懂,适用…

【架构设计】如何设计一个高性能短链系统

一、前言 所谓系统设计,就是给一个场景,让你给出对应的架构设计,需要考虑哪些问题,采用什么方案解决。很多面试官喜欢出这么一道题来考验你的知识广度和逻辑思考能力。 虽然各个系统千差万别,但是设计思想基本一致&a…

【考研复习】24王道数据结构课后习题代码|2.3线性表的链式表示

文章目录 总结01 递归删除结点02 删除结点03 反向输出04 删除最小值05 逆置06 链表递增排序07 删除区间值08 找公共结点09 增序输出链表10 拆分链表--尾插11 拆分链表--头插12 删除相同元素13 合并链表14 生成含有公共元素的链表C15 求并集16 判断子序列17 判断循环链表是否对称…

Android Studio实现刮刮卡效果

代码和刮刮乐图片参考网络 实现效果 MainActivity import android.app.Activity; import android.os.Bundle;public class MainActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentVi…

ruoyi-cloud微服务新建子模块

ruoyi-cloud微服务新建子模块 1、复制system模块 直接复制 modules下面已有的system模块,改名为 test 2、在modules下的 pom.xml文件中添加子模块 3、进入 test模块修改 pom.xml 把原有的system 修改成test 4、修改对应的包名、目录名和启动应用程序为test 5、修…

大学生口才培训需求分析

标题:大学生口才培训需求分析 摘要: 本论文旨在分析大学生口才培训的需求,通过对大学生口才培训的重要性、现状和挑战进行研究,并结合相关理论和实践经验,提出相应的培训需求和解决方案。通过本论文的研究&#xff0c…

介绍另外一个容器技术, Apptainer

一说到容器,我们往往会脱口而出, Docker, 实际上Docker 仅仅是Linux 容器化的一种, 今天介绍的Apptainer 就是另外一种容器技术。 那么Apptainer 具体是一个什么东西呢? 跟Docker 有什么区别呢? 首先&#…