技术标签: 驱动程序 linux 匠心之作 | 蓝牙开发详解 驱动开发 mcu iot
【所有文章汇总】
蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4GHz ISM
(即工业、科学、医学)频段,使用IEEE802.11
协议。
自1994年由爱立信推出至今,蓝牙技术已经走过了20个岁月。从最初的Bluetooth V1.0
,到Bluetooth V5.2
,经历了近9个版本的修订后,发展为当前的状况。
“蓝牙”的形成背景是这样的:
1998 年 5 月,爱立信、诺基亚、东芝、 IBM和英特尔公司等五家著名厂商, 在联合开展短程无线通信技术的标准化活动时提出了蓝牙技术,其宗旨是提供一种短距离、 低成本的无线传输应用技术。
芯片霸主 Intel 公司负责半导体芯片和传输软件的开发,爱立信负责无线射频和移动电话软件的开发, IBM 和东芝负责笔记本电脑接口规格的开发。
1999 年下半年,著名的业界巨头微软、摩托罗拉、三星、朗讯与蓝牙特别小组的五家公司共同发起成立了蓝牙技术推广组织,从而在全球范围内掀起了一股“蓝牙”热潮。
全球业界即将开发一大批蓝牙技术的应用产品, 使蓝牙技术呈现出极其广阔的市场前景,并预示着 21 世纪初将迎来波澜壮阔的全球无线通信浪潮。
BLE(Bluetooth Low Energy)
低功耗功能
蓝牙协议包括两种技术:BR:Basic Rate
和LE:Low Energy
。这两种技术都包括搜索(discovery)
管理、连接(connection)
管理等机制,但它们是相互独立的,不能互通的技术!
厂商如果只实现了一种,那么只能与同样实现该技术的设备互通。
如果厂商要确保能和所有的蓝牙设备互通,那么就只能同时实现两种技术,而不去管是否真的需要。
BR:Basic Rate
是正宗的蓝牙技术,可以包括**可选(optional)的EDR(Enhanced Data Rate)
技术,以及交替使用的(Alternate)**的MAC(Media Access Control)
层和PHY层扩展(简称AMP(Alternate MAC and PHY layer extension)
)。
BR
:最早期的蓝牙技术,速度只能达到721.2Kbps
,在那个年代,已为高大上了。EDR
:随着技术的提升,使用EDR
技术的蓝牙,理论速率可以达到2.1Mbps
。AMP
:使用AMP
技术的蓝牙,理论速率可以达到54Mbps
。
AMP
的Alternate交替使用
体现在:由于蓝牙自身的物理层和AMP技术差异太明显,BR/EDR
和AMP
是不能同时使用的。简单的说,就是:
BR
和EDR
是可以同时存在的,但BR/EDR
和AMP
只能二选一
上面所讲的BR技术的进化路线,就是传输速率的加快、加快、再加快。
但能量是守恒的,你想传的更快,代价就是消耗更多的能量。而有很多的应用场景,并不关心传输速率,反而非常关心功耗。
这就是
Bluetooth LE
(称作蓝牙低功耗)产生的背景。
从它的英文名字上就可以看出它是一种低功耗蓝牙技术,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。
低功耗蓝牙与经典蓝牙使用相同的2.4GHz
无线电频率,因此双模设备可以共享同一个天线。低功耗蓝牙使用的调制系统更简单。
LE
技术相比BR
技术,差异非常大,或者说就是两种不同的技术,凑巧都加一个“蓝牙”的前缀而已。
目前BLE
主要广泛应用于IoT产品领域。
市面上,大致有几种蓝牙架构:
一般是半导体厂商半开源协议栈,把开发的蓝牙协议栈直接烧写到蓝牙芯片中,(比如CSR BC4/5,CSR8670,CSR8675,TI CC2540,NRF51xxx,NRF52xxx,乐鑫ESP32等等),架构如下:
此类芯片一般可以直接做为MCU用,这类产品一般用于消费类电子,集成度很高,调调部参数可以直接使用,常见的有蓝牙耳机等产品。
在集成好的蓝牙芯片基础上,通过特定的接口(UART居多),发送自定义的command
来达到想要的功能。比如发送0x01代表搜索周围设备…
此部分的应用,将蓝牙作为一个外设使用,用于远程通信。
例如网上卖的一些蓝牙串口。
这种应用算是蓝牙最复杂的应用,客户需要使用蓝牙的场景有很多,牵涉到的蓝牙协议也有很多,需要将Host
与Controller
分开,集成更多的蓝牙协议,比如蓝牙电话(HFP),蓝牙音频(A2DP),蓝牙音乐控制(AVRCP),蓝牙电话本(PBAP),蓝牙短信(MAP)等。
其中Transport
是一个协议,H2
就是在USB
的基础上的协议,H4,H5,BCSP
是UART基础上的协议,当然还有SDIO
。
此部分应用,将定制蓝牙的各种服务,实现蓝牙多功能需求,
大概列举了以下几种,帮助理解:
1)手机 -> 手机的蓝牙复杂应用,注定要用第3种方案,也就是蓝牙协议栈(host)在主芯片中,蓝牙芯片为HCI架构的
2)蓝牙音响,蓝牙耳机 -> 此种应用一般用单芯片方案就能hold住,比如CSR8670/8675/杰理蓝牙等,好处在于开发便捷
3)蓝牙手表 -> 手表要看功能复杂性,如果仅仅有时间显示,传感器交互,蓝牙,那么可以选择单芯片方案(也就是方案1),如果有网络等比较复杂的功能就要使用MCU+蓝牙芯片方案(也就是方案3)了
4)蓝牙手环,蓝牙心率带等 -> 基本上是单芯片方案
[1]:蓝牙官网:https://www.bluetooth.com/
[2]:https://blog.csdn.net/XiaoXiaoPengBo/article/details/107466841
[3]:https://zhuanlan.zhihu.com/p/43516534
文章浏览阅读1.2w次。1.反斜杠的问题:错误示范:title = sel.xpath(’//div/h2/a text()’)正确:title = sel.xpath(’//div/h2/a/text()’)_lxml.etree.xpathevalerror: invalid expression
文章浏览阅读181次。固定静态ip。_csdn ip固定
文章浏览阅读7.2k次。sprig-schedule:一句话——作业调度spring-schedule Cron表达式:Cron 表达式的格式:秒(seconds) 分(minutes) 时(hours) 日(day-of-month) 月(month) 周(day-of-week) 年(year非必须)各个格式允许的值和允许的特殊字符字段名 允许的值 允许的特殊字符 秒 ..._schedule表单
文章浏览阅读8k次,点赞30次,收藏97次。很多CPPers都会对指针和引用的使用感到头疼,特别是在两者混用的时候。而指针和引用一个最大的用途就是作为函数形参。以下为本人总结的一些int* 与 int*&在作为函数形参的使用中的区别1.int* value指针大家都不陌生,指针在作为函数形参时,最广泛的用途就是传入数组的首地址,进而在函数中对数组进行操作。int Calc(int *value){ //value则为数组value[]的首地址 //可以直接使用value[]操作数组}所以,用int* value作为_int &value
文章浏览阅读1w次,点赞12次,收藏74次。由于需要做点云处理,在python中处理点云对象看不见效果很难受,于是想到将点云数据转成pcd文件,使用pcl查看空间形象。我是先将点云从h5文件中读出,具体操作可以看我的另一个文章->博客直链好了,我们在python中得到了点云对象,如图所示:另起文件写一个工具类,定义一个写成pcd的方法import os#传入点云对象def points2pcd(points): #存放..._asc转pcd python
文章浏览阅读958次,点赞21次,收藏20次。Java目 录摘 要Abstract第一章 绪 论1.1选题背景1.2研究现状1.3研究内容第二章 开发工具及关键技术介绍2.1微信开发者工具2.2微信简介2.3小程序框架以及目录结构介绍2.4 JAVA技术2.5 Mysql数据库第三章 系统分析3.1需求分析3.2可行性分析3.2.1技术可行性:技术背景3.2.2经济可行性3.2.3操作可行性:3.3性能分析3.4系统操作流程3.4.1管理员登录流程3.4.2信息添加流程3.4.3信息删除流程第四章 系统设计与实现4.1系统架构设计。_#小程序://csdn社区/kfsdisda0bzkkbg
文章浏览阅读2.9k次,点赞2次,收藏9次。什么是序列化和反序列化?序列化:序列化就是将 java对象 转化为字节序列的过程。序列化是指把一个Java对象变成二进制内容,本质上就是一个byte[]数组。 为什么要把Java对象序列化呢?因为序列化后可以把byte[]保存到文件中,或者把byte[]通过网络传输到远程,这样,就相当于把Java对象存储到文件或者通过网络传输出去了。注意:序列化是为了在传递和保存对象时,为了保证对象的完整性和可传递性。将对象转为有序的字节流,以便在网上传输或者保存在本地文件中。反序列化:反序列化就是将 字_java序列化与反序列化全讲解 mocas_wang
文章浏览阅读4.7k次。<!--pre.display {font-family:inherit}pre.format {font-family:inherit}pre.smalldisplay {font-family:inherit; font-size:smaller}pre.smallformat {font-family:inherit; font-size:smalle
文章浏览阅读520次。1、@value给属性赋值,使用方式有三种:基本数值SpEL; #{}写${};取出配置文件【properties】中的值(在运行环境变量里面的值)使用如下: @Value("张三") private String name; @Value("#{20-2}") private Integer age; @Value("${person.nickName}") private String nickName;其中第三种需要增加外部配置文件,需要使用@PropertySource_@value integer
文章浏览阅读1.2k次。学习Python爬虫怎么赚钱?(文末免费赠Python资料)_python爬虫怎么挣钱
文章浏览阅读1.5k次。关于的入门,可以参考:《LaTeX环境配置》,和《LaTeX入门(一)》当然,我不打算继续从 入门(二)开始写起,关于这个新的专题:学习指南,将会一直写下去,与 R 语言系列一样不断地更新,同时,我希望,尽可能地解释清楚复杂的过程,降低的学习成本,同时在必要的情况下,进一步讲解如何与 R 语言实现联合使用,无缝对接,自动化输出。最后一点,特别地,我希望将与 Word..._latex中文模版双栏
文章浏览阅读463次。到此SpringBoot 自定义TaskExecutor线程池执行异步操作介绍完成。最近项目中有使用到通过自定义线程池来执行异步操作的配置,特此记录便于日后查阅。_springboot 定义task