geekpwn-research
geekpwn调研
汽车安全
A vulnerability affecting Hyundai and Genesis vehicles where we could remotely control car
时间:2022-11-30
针对现代品牌的汽车。本质上就是汽车控制软件的漏洞,漏洞很简单,为邮箱后加入%0d
后会暴露受害者的密码,从而登录受害者的账号,在软件上控制受害者的汽车。
SiriusXM IDOR vulnerablity exposed vehicle token,that make unauthorized remotely control Honda, Nissan, Infiniti, and Acura vehicles
时间:2022-11-30
针对本田、日产等汽车品牌。也是汽车控制软件上的漏洞,通过fuzz不同车主的车辆vin
码,可以得到很多车主的敏感信息,还可以借助vin
码远程操控车辆。
Reverse engineering an EV charger
时间:2022-11-11
对电动汽车的充电器(Zaptec Pro
充电器)进行逆向。现在的电动充电器是Debian
操作系统+Wifi
+4G
+蓝牙
,可以看作树莓派,就是充电桩。
这俩人通过分析NAND
闪存,从引导分区中提取到了设备树文件,从而知道充电器内硬件的配置方式,来控制传递给linux内核的引导参数,进入到了单用户模式,拿到了该充电器的一个shell
。
之后,他俩又对PIN码进行分析,发现PIN初始码出场的时候由公司自己设置,可看作是随机的。那么知道PIN码可以做什么呢?能不能免费充电呢?最终结果是不能,蓝牙接口实现的功能是有限的。本充电器也没有放硬编码root密码(意思就是密码以明文方式直接写入到代码中),对云平台与充电器的流量进行分析,会发现充电器会把内核日志与用电量数据传回给云平台,云平台也能远程在充电器运行函数。
这个充电器没啥严重的安全问题,不足就是没有使用加密的NAND闪存,让研究者获得了充电器的root权限。
Bypassing the Renesas RH850/P1M-E read protection using fault injection
时间:2022-11-08
故障注入,我理解的就是通过给设备一些不正常的电平信号等,来绕过设备的一些安全检查。比较复杂,最终可以绕过一个禁用设置。
TesMla: An app to complete man in the middle attack with Tesla Model 3
时间:2022-09-19
一个在Model3中应用中间人攻击的app。特斯拉的钥匙可以直接是手机APP,手机靠近时特斯拉会与手机进行蓝牙配对从而进行解锁。研究人员在车主手机上安装了一个TesMla程序,从而使得黑客可以自己解锁启动Model 3。
手机与Model 3的认证协议如下:
中间人攻击原理:就是在车主手机和他的车中间建立中间节点,让车主即使不在车附近,也能够解锁车辆。
前提条件:
- 车辆与 Phone Key 之间的重新连接仅取决于车辆的 BLE MAC 地址。特斯拉 Model 3 使用其始终静态的公共 MAC 地址进行广播。Phone Key 不会将车辆与具有相同 BLE MAC 地址的其他恶意设备区分开来,因为重新连接不会检查其他信息。
- BLE 通信都是明文形式。它为对手提供了嗅探的机会。
- 20 字节的令牌 G 的值在数小时内保持不变。连接状态不会导致令牌更新。无论 Phone key 和 Model 3 多次连接和断开连接,令牌都可能保持不变。
攻击过程:
How I hacked my car
时间:2022-05-22
针对现代汽车,目前已修复(但是还是可供用户选择是否修复)。这个帖子是真的牛逼。
本文针对现代2021Ioniq SEL`的车载信息娱乐(In-Vehicle Infotainment:IVI)系统(就是车中间显示屏)进行hack。
首先,通过转到软件更新屏幕进入到工程模式,里面含有大量的隐藏设置,其中重要的是USB拷贝
(将日志复制到USB驱动器,或者从USB设备中下载并更新系统),还有就是ADB TCP调试
,但是扫描之后发现没有ADB端口。
目前仅有一些日志,这些日志内容包含在IVI上运行的应用程序的记录。目前的思路是,对IVI上运行的程序进行逆向,从而写一个类似的应用程序,并使用USB设备使IVI下载并更新系统从而安装这些程序,最后获得系统权限。
在官网上找到了一些IVI模块的固件,例如GPS与HD Radio以及各种系统映像,但是这些系统映像是加密的,例如John The Ripper
与Hashcat
等工具都无法暴力破解,但是找到了另一个工具bkcrack
,这个工具要求如果能在加密zip中找到一个文件的至少12字节,就可能对此文件进行解密(其中一个坑就是要的文件的12个字节不是原始文件本身,而是原始文件的压缩版本)。最终,找到了一个未加密过的固件,里面有一个一模一样的文件,就可以解密了。
解密后发现里面有一个网卡的驱动程序,于是买了相应的网卡,但是只能访问CarPlay和Android Auto 服务器,没有其他端口可用。又发现其中有一个文件在工程模式下将IP和MAC设置为一个固定值,于是打算用ethtool
修改MAC地址,之后又修改IP,看看能访问不。
但是访问不了,因为日志中固定IP与MAC始终是eth0
设备,这是某种始终处于离线状态的内置网卡,用别的其他网卡都是显示eth1
。
那就直接用USB更新自己写的固件呗。
首先得知道固件咋写的,其中用了什么加密,什么安全措施。找到了一个shell
脚本文件linux_envsetup.sh
,这是创建系统更新zip
的脚本,里面写了zip
的密码,加密方法,密钥和IV,还使用RSA签名。之后,用binwalk
提取updateboot.img
中的信息,提取出了类似于linux系统的文件结构,里面有一个updateAgent
文件,逆向后发现有RSA公钥,直接Google发现是常见公钥,于是私钥也知道了。
总结一下,通过linux_envsetup.sh
脚本,可以了解D-Audio2V
加密固件更新是如何进行的:
- 所有各种二进制文件都被分类到正确的目录中。(Micom 更新放在 micom 文件夹中,系统映像放在系统文件夹中,等等。)
- 使用重复的 SHA224 计算更新中每个二进制文件的哈希值,这些哈希值被放入 update.cfg 文件中。每行包含文件的原始名称、一个冒号,然后是文件的哈希值。更新.cfg 文件
- 某些文件使用 AES 测试密钥加密,这些文件被重命名为
enc_{OriginalName}
。 - 使用与其他文件相同的方法对 update.cfg 文件进行哈希处理,然后对哈希进行签名。签名的哈希值被放入 update.info 文件中。
- 所有二进制文件、update.cfg 文件和 update.info 文件都被压缩到一个加密的 zip 文件中。
那么可以直接写或者修改系统固件。
但是,先不要这么着急,我们就想拿一个shell,在官方更新固件中找到了一个运行 Guider 的新 bash 脚本,Guider 是一种基于 Python 的性能分析工具。新的固件中运行了Guider。直接在Guider脚本中添加后门。
添加了两个后门。第一个是一个 USB 脚本启动器,它会在插入系统的任何闪存驱动器上搜索并启动一个名为1C207FCE3065.sh
的脚本文件。第二个后门是一个简单的 python 反向 shell,它会尝试连接到192.168.0.2
,当通过 Wi-Fi 连接时,这将是我的手机或笔记本电脑。然后相应的修改各种签名哈希值啥的。
之后,将新固件放到USB闪存上,然后进入IVI设置应用程序下载更新。最终,第二个后门不起作用,直接用的第一个后门,拿到了shell的root权限。
最终,作者还自己写了个IVI的程序,用于锁车解锁车什么的,就不细说了。具体见:
https://programmingwithstyle.com/posts/howihackedmycarpart3/
总之,很牛逼。
充电桩漏洞
充电基础设施
分为四层:信息接入层、基础设施层、运营服务层以及数据共享层。
直流充电桩最广泛。充电桩将电网中的电力通过动力电源输,经过功率变换单元转化为与电动汽车匹配的功率,由输出开关单元控制充电过程,使用充电电缆车辆插头传送电能给电动汽车。在整个充电过程中,主要的控制和数据交互部分是充电控制单元承担的。
重点就是充电控制计费单元(TCU)。TCU 集成串口、CAN总线、485总线、SD总线、以太网、SIM卡槽、音频、LVDS、数字量输入输出等接口,并支持北斗、GPS双模定位、蓝牙通信、4G全网通通信等功能,可实现充电桩人机显示、计费计量、支付、数据加密、控制充电设备、与车联网平台通信等业务相关的管理功能(全能啊,小电脑)。相应的硬件标注见:https://delikely.github.io/2021/10/20/Charging-infrastructure/。
充电网络中有专门的通信协议,如下图所示:
BMS(Battery Management System)用于电动汽车充电机与电池管理系统之间。计费控制单元与充电控制器之间使用了类似于BMS的协议。计费控制单元与电表之间使用DL/T 645、Modbus 等协议。不同的运营商有不同的充电机与运营平台协议,例如OCPP(全球开放性的通信标准)、T/CEC 102.4(中电推出的)等。
充电桩常见攻击面:
- 充电桩系统配置界面(HMI界面)弱口令。
- 应用安全。充电桩采用的嵌入式linux,其中各类组件可能存在已知漏洞。
- 硬件安全。调试接口(串口、网口)未做防护,固件容易被提取分析。
- 通信安全。有的通信协议不安全,有的板载协议不安全(例如读卡器使用的RS232)。
- 通信消息上业务逻辑上的缺陷,例如伪造VIN码(车辆识别码)实现免费换充电。
- 云平台安全。ECMP(电动汽车充电监控运营管理平台,EV CHARGING MANAGEMENT PLATFORM)上的WEB 组件漏洞、主机漏洞、服务配置不当、逻辑漏洞等,会造成大量的数据泄露。
充电桩漏洞挖掘实战
针对两家公司:Ebee(Bender)与GARO。在这两家公司的官网上能下载固件。
对Ebee的固件进行分析,发现了SSH硬编码,可以将用户权限提升为普通权限(利用CVE-2021-34601,CVE-2021-34602
)。利用硬编码进入系统发现了明文存储的web后台的账号与密码,并存在命令注入漏洞。
对GARO进行分析,主要存在:web管理页面上缺少用户查看与修改信息的访问控制,即无认证(CVE-2021-45878);Tomcat Manager硬编码允许攻击者获得授权访问并完全控制Tomcat(CVE-2021-45877);url的downloadAndUpdate
容易受到命令注入。未经过滤的用户输入用于生成代码,然后在下载新固件时执行(CVE-2021-45876)。
蓝牙相关
低功耗蓝牙攻击实用指南
BLE(Bluetooth Low Energy)指的是低功耗蓝牙,它在保持相同的通信范围的同时,功耗更低,非常适合低数据速率的持久长连接情况下使用。BLE特点:多平台通信,较快匹配速度,长时间连接。
BLE的安全问题
(1)窃听。(2)中间人攻击。(3)Dos&Fuzz。
BLE的两个核心概念
GAP 通用访问配置文件(Generic Access Profile)
其用于设备连接与广播通信,负责设备对外可见性。GAP中有外围设备(蓝牙心率检测器等)和中心设备(手机)的概念。外围设备每隔一段时间发送广播数据,中心设备对其回应,外围设备再次回应。
GATT 通用属性配置文件(Generic Attribute Protocol)
定义两个BLE设备如何进行数据交换。它有服务和属性两个概念,服务可以理解为可以容纳很多抽屉的柜子,而属性就是其中的抽屉。可以看到,一个服务可以有多个属性。服务和属性都有自己的唯一识别码。
BLE利用工具
Linux安装blueZ
(蓝牙栈),BlueZ的功能是编写实现蓝牙无线标准规范。还有hcitool
与gattool
。hcitool
利用笔记本电脑的主机控制器接口与BLE设备进行通信和读写更改,因此,hcitool
可以在连接受害者BLE设备后更改受害者设备的某些值。而gattool
主要用来帮助发现可用 BLE 设备的服务和属性,以便根据攻击者读取/写入受害者的数据。nRF Connect
可以嗅探和写入数据。
之后,使用Blash
对BLE进行攻击。具体见:
漏洞收集
智能电视漏洞挖掘
历史智能电视漏洞汇总
- 命令注入。某电视品牌使用反引号命令执行,应该是系统重命名阶段的时候,加入类似于
sleep 5
的命令。 - 乐视电视利用
UPnP
任意安装应用。手机端连接到电视后利用UPnP
中的XML的文件声明,该文件声明一开始是用于电视机下载遥控器应用更新的。通过发送XML Message
,请求里含有DownLoadFile
的服务,由于电视机没进行有效过滤,从而能够下载任意apk,下载完之后利用电视广播服务,可以调用系统内部的静默安装服务,从而安装软件。 - TCL目录遍历(CVE-2020-27403);Sony Smart TV 目录遍历(CVE-2019-10886)等。
- 权限提升(针对LG webOS)。luna-send-pub 命令调用 downloadmanager 服务可以下载文件到本地的任意位置,且文件属主为 root ,而系统中的 /etc/luna-services2/ls-hubd.conf 配置文件中定义了可执行脚本,脚本在开机之后会被 Root 调用指令。那么,就可以这样利用:(1)在本地创建 ls-hubd.conf 文件;(2)在电视中编写反弹 shell 脚本;(3)使用 luna-send-pub 下载 ls-hubd.conf 覆盖原有文件;(4)本地监听,然后重启服务之后就拿到了具备 Root 权限了 Shell 了。
- 拒绝服务漏洞,ADB漏洞等。
- SUPRA智能云电视视频劫持漏洞(CVE-2019-12477)。开了80端口,能够用投屏服务,但是没有验证用户和资源的合法性,因此未授权用户可以播放任意内容。智能电视开放的端口很多,可以在上面做文章。
智能电视GetShell
智能电视的操作系统有:Android,WebOS(LG的电视,基于Linux),Tizen(三星的电视,基于Linux)。
厂商留了adb调试,但是调试的时候发现权限不够。一个提权点就是厂商留的一个后门,当factory.debug = 1时,会以root
权限调用factory_app,但是被SElinux(可以理解为一个最大限度减小系统中服务进程可访问资源的一个服务)阻断了。于是准备在电视开机前,进入uboot
,更改uboot
中的参数,于是使用串口调试,进入BootLoader
关闭SELinux
。
知识补充
Token与jwt
token
token的认证流程
- 用户输入用户名和密码,发送给服务器。
- 服务器验证用户名和密码,正确的话就返回一个签名过的**token**,浏览器客户端拿到这个token。
- 客户端自己保存token,后续每次请求中,浏览器会把token作为http header发送给服务器,服务器验证签名是否有效,如果有效那么认证就成功,可以返回客户端需要的数据。
特点:可以隐藏真实数据,但是服务器拿到之后得查数据库验证token正确性。
jwt(json web token)
概念。将用户信息加密到jwt里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证jwt的正确性,只要正确即通过验证。
组成。通常由Header头部,Payload负载和Signature签名3部分组成,3部分之间用.
分割,如下所示:
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c |
- Header一般由
{ "alg": "哈希算法", "typ": "JWT" }
,经base64编码形成。 - Payload就是双方定义的一些消息内容,例如
{"sub": "1234567890", "name": "John Doe","admin": true }
,经base64编码形成。 - Signature就是将前两部分用一个
secret
进行加密,例如使用的是HMAC SHA256
算法,那么签名就是:HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
。
验证。客户端带着jwt
来发起请求,服务端就直接使用secret
进行解密,解签证解出第一部分和第二部分,然后比对第二部分的信息和客户端穿过来的信息是否一致。如果一致验证成功,否则验证失败。
特点:jwt包含用户信息且无法修改,但可以分担服务器的存储压力。
Fuzzing 模糊测试
源代码或二进制文件的模糊测试
灰盒测试有广泛的应用。开始时在程序编译阶段对程序进行插桩,插桩后得到的反馈数据来判断哪些变异的种子是优秀的种子。这可以指导遗传变异算法,可引导测试种子向优异的方向变异而无需人工建模。下图是灰盒测试具体架构:
其他类型的测试
还包括环境变量和参数的模糊测试(对环境变量进行修改,常用的工具为iFuzz
。);web应用程序的模糊测试,工具为webFuzz;文件格式的模拟测试;网络协议的模糊测试等。
UPnP
UPnP意思就是通用即插即用,主要用于设备的智能互联互通,不需要使用设备驱动程序,它包含很多基本协议,例如SSDP、GENA、SOAP等。要达到的目标就是:任何设备接入网络之后,网络设备就能知道有新设备加入,且设备之间可以相互通信。
OTA
类似于咱现在手机的系统升级,直接连接wifi下载升级包进行升级,而无需刷机升级,就是OTA。
蓝牙安全
piconet的定义
Piconet是一个术语,它通常用于描述蓝牙技术中的一个基本网络。在蓝牙技术中,Piconet是一个由一个主设备和最多七个从设备组成的短距离无线网络。主设备控制整个网络,从设备则被动地接收和发送数据。当需要连接更多的设备时,可以使用蓝牙中的扩展蓝牙(Bluetooth scatternet)技术,将多个Piconet连接成一个更大的网络。
Piconet通常用于描述蓝牙设备之间的短距离通信,例如,当您将手机与蓝牙耳机配对时,就会创建一个Piconet网络。在Piconet中,主设备和从设备之间的通信是通过一种称为”时分多址”(Time Division Multiple Access, TDMA)的技术实现的,该技术将时间划分为短时间段,每个设备在自己的时间段内发送和接收数据。这种技术使得多个设备可以在同一个频率上进行通信而不会互相干扰。
BLE的密钥交换配对
生成初始密钥(K_init)
根据E22算法生成K_init。E22的输入由3部分组成:(1)从设备的物理地址:BD_ADDR。在生成K_init前,主设备通过询问方式获得从设备的地址BD_ADDR。(2)PIN码及其长度,PIN码是双方设备预先设定的。(3)有一个128位的随机数(IN_RAND)。由主设备产生,并以明文方式传送给从设备。
生成链路密钥(K_ab)
- 主设备A产生128位的随机数LK_RAND_A,从设备B也产生128位的随机数LK_RAND_B。
- 主设备A将K_init与LK_RAND_A进行位比特逻辑异或运算,异或结果发送给B设备;同样的,在B设备中,K_init和LK_RAND_B进行位比特逻辑异或运算,结果发送给A设备。
- A和B设备都具有相同的K_init、LK_RAND_A和LK_RAND_B。
- 设备A和B分别用E21算法将LK_RAND_A和BD_ADDR_A、LK_RAND_B和BD_ADDR_B加密,并将结果进行异或得到K_ab。
双方认证
双向认证采用challenge-response(挑战-应答)方式。主设备A为应答方,从设备B为请求方。
- 作为应答方的A设备产生一个128位的随机数AU_RAND_A,并以明文的方式传送至B设备。
- A、B设备用E1算法将AU_RAND、K_ab和BD_ADDR_B加密运算分别生成32位的SRESA和SRESB。
- B设备将结果SRESB传送给A设备,A设备比较SERESA和SERSB,如果两个的值相等,此次认证通过。执行完此次认证后,A设备和B设备的角色对换,即A设备作为请求方,B设备作为应答方,采用同样的方式进行认证。
针对蓝牙协议的攻击
a. 中间人攻击
假设一个设备A和B之前已经通信过,当通信完成之后,A和B是互相知道彼此的链路密钥的。
B通过修改自身地址,把自己的地址改为A的地址后,伪装成A和C通信,那么C此时就以为自己和A通信。B也可以伪装成C和A去通信,因为B知道A的链路密钥,B是能够通过A的认证从而和A进行连接 。这样 A和 C之间并没有进行实质的通信 ,都是B分别伪装和A,C通信。这样就造成了中间人攻击。
这种中间人攻击的主要原因在于蓝牙通信链路密钥在硬件层生产,而且每次认证都相同。
b. PIN码攻击、中继攻击、鉴权DOS攻击
针对蓝牙实现过程的攻击
a. BlueBorne
To be continue
https://www.anquanke.com/post/id/86949
之后详细看一看这篇。
BLE的信道与数据包格式
BLE有40个信道,有3个信道是advertising channel(广播通道),分别是37、38、39,用于发现设备(Scanning devices)、初始化连接(initiating a connection)和广播数据(broadcasting date)。剩下的37个信道为data channel(数据通道),用于两个连接的设备间的通讯。
BLE的报文分为广播报文和数据报文,这两个报文的格式是相同的,分为前导码、访问码、有效载荷和循环冗余校验校验码组成。
注:octet指的就是1byte。
前导码Preamble
用于频率同步、数据速率同步、自动增益控制调整,固定为 01010101或者10101010序列。
访问码Access Address
广播报文地址为:0x8E89BED6。
BLE协议栈
如下图所示:
Physical layer
使蓝牙可以使用2.4GHz频道,并且能自适应的调频。
Link layer
用于控制设备的射频状态,设备将处于Standby(待机)、Advertising(通告)、Scanning(扫描)、Initiating(初始化)、Connection(连接)这五种状态中的一种。
- 待机状态(Standby State):此时即不发送数据,也不接受数据,最节能;
- 通告状态(Advertising State):通告状态下的设备一般也被称为通告者(Advertiser),它会通过advertising channel(广播通道)周期性的发送数据,广播的数据可以由处于Scanning state或Initiating state的实体接受;
- 扫描状态(Scanning State):可以通过advertising channel(广播通道)接受数据的装填,该状态下的设备又被称为扫描者(Scanner);
- 初始化状态(Initiating State):和Scanning State类似,不过是一种特殊的状态。Scanner会侦听所有的advertising channel,而Initator(初始化者)则只侦听某个特定设备的广播,并在接受到数据后,发送连接请求,以便和Advertiser建立连接;
- 连接状态(Connection State):由Initiating State或Advertising State自动切换而来,其中,Initiater方被称为Mater(主设备),Advertiser方则称作Slave(从设备)。
HCI
主机控制接口层(Host Controller Interface,简写HCI):定义Host(主机)和Controller(控制器)之间的通信协议,这一层可以是软件或者硬件接口,如UART(串行通信的集成电路。常用于将数据从一个设备传输到另一个设备,例如将数据从计算机发送到外围设备)、USB等。
Generic Access Profile(GAP)
直接与应用程序或配置文件通信的接口,它实现了如下功能:
- 定义GAP层的蓝牙设备角色(role)。
- Broadcaster(广播者):设备正在发送advertising events
- Obserber(观察者):设备正在接受advertising events
- Peripheral(外设):设备接受Link Layer连接(对应Link Layer的slave角色)
- Central(主机):设备发起Link Layer连接(对应Link Layer的master角色)
- 定义GAP层的用于实现各种通信的操作模式:蓝牙设备发现、蓝牙设备连接等。
- 定义蓝牙地址、蓝牙名称、蓝牙的PIN码。
Logical Link Control and Adaptation Protocol(L2CAP Protocol)
为上层提供数据封装服务,允许逻辑上的点对点数据通信。
Security Manager(SM)
负责BLE通信中有关安全的内容,包括配对(pairing,)、认证(authentication)和加密(encryption)等过程。
Attribute protocol(ATT)
在BLE协议栈中,Physical Layer负责提供一系列的Physical Channel;基于这些Physical Channel,Link Layer可在两个设备之间建立用于点对点通信的Logical Channel;而L2CAP则将这个Logical Channel换分为一个个的L2CAP Channel,以便提供应用程序级别的通道复用。
物联网需要信息采集,基于信息采集的需求,BLE抽象出Attribute protocol,该协议将这些信息以Attribute(属性)的形式抽象出来,并提供一些方法,供远端设备(remote device)读取、修改这些属性的值(Attribute value)。
提供信息(Attribute)的一方称作ATT server(一般是那些传感器节点),访问信息的一方称作ATT client。
一个Attribute由Attribute Type、Attribute Handle和Attribute Value组成:
- Attribute Type用以标示Attribute的类型,类似于我们常说的温度、湿度等人类可识别的术语,通过UUID进行区分。
- Attribute Handle是一个16-bit的数值,用作唯一识别Attribute server上的所有Attribute。一个server上可能存在多个相同type的Attribute。
- 同一类型的多个Attribute,可以组成一个Group。
Attribute也能够定义一些权限(Permissions),以便server控制client的访问行为。
Generic Attribute profile( GATT)
ATT仅仅定义了一套机制,允许client和server通过Attribute的形式共享信息,ATT并不关心共享哪些信息,因为这是GATT关心的事情。如下图所示:
由上图可知,GATT中的三个要素Profile、Service、Characteristic以及他们的层级关系。值得注意的是,“Profile”是基于GATT所派生出的真正的Profile,这是SIG蓝牙技术联盟对一些同范畴内的Service打包后的集合,如电池、心率、血压等,作用不大。
Service可以理解为PHP中的类。Characteristic可以理解为PHP的函数,是GATT中具体的功能对象,每个Service都可以包含一个或多个Characteristic(特征)。
上图除Profile外,Service、Characteristic、Characteristic Properties、Characteristic Value、Characteristic Descriptor等等,都是作为一个Attribute存在的。
留言
- 文章链接: https://wd-2711.tech/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!