移动开发经验汇总
"拥有十几年的开发经验,致力于创造出卓越的移动应用,改变人们的生活方式。"
展开
-
Android
SCO逻辑传输,是在主机和特定从机之间的一个对称的点对点传输。SCO逻辑传输保留插槽,因此可以被视为主机和从机之间的电路交换连接。主服务器最多可以支持三个到同一从服务器或不同从服务器的SCO链接。从属服务器最多可以支持来自同一主服务器的三个SCO链接,如果链接来自不同的主服务器,则支持两个SCO链接。SCO数据包永远不会被重新传输eSCO逻辑传输,是主机和特定从机之间的点对点逻辑传输。eSCO逻辑传输可以是对称的或不对称的。原创 2024-02-25 19:04:45 · 395 阅读 · 0 评论 -
Android
Host(纯软件的概念) (跟医院的功能简单类比)GAP: Generic Access Profile, 通用访问规范 (大堂: 按指定流程确定科室、挂号 发现设备、连接设备)GATT: Generic Attribute Profile, 通用属性规范 (医务室: 为病人提供服务 也是提供服务, 有哪些服务, 服务由哪些属性组成)原创 2024-02-25 19:09:15 · 872 阅读 · 0 评论 -
Android
1、ANCS(Apple Notification Center Service)是IOS系统中的一个通知服务,使用该服务的方式为,设备连接手机后,设备上的GATT客户端发现IOS手机端上的ANCS服务,并且使能其通知源Characteristics的notifys功能,之后IOS系统就会通过ble推送消息给设备。原创 2024-02-25 19:07:11 · 924 阅读 · 0 评论 -
Android
HID写数据给Input子节点流程:键盘手柄->按键发送Keycode(HCI)->协议栈(bta_hh_cback()函数)->HID驱动()->Input子节点(getEvnet)原创 2024-02-25 19:01:11 · 1059 阅读 · 0 评论 -
Android
目录一、HID Reports : Bluetooth HID devices支持三种Report:Input, Output, Feature。二、HID channel 三、HID Report Modes五、BLE HID 服务 : 手册 HIDS-V1.0.0-(HID-Service).pdf 1、Protocol Mode Characteristic :编辑2、Report Characteristic : 3、Report Map Characteristic4、Boot Keyboar原创 2024-02-25 19:02:33 · 870 阅读 · 1 评论 -
Android 、
配置路径:xref: /packages/apps/Bluetooth/res/values/config.xml。协议配置文件有2个,一个是谷歌源生的,一个是高通自己添加的。优先级:高通 > 谷歌。对于同一种协议会进行覆盖。其中,ture 代表支持,false代表不支持。其中ldac为5001,优先级最高。原创 2024-02-25 19:05:16 · 408 阅读 · 0 评论 -
Android
PBAP:Phone Book Access Profile的简称,电话本访问协议,是一种基于OBEX的上层协议,该协议可以同步手机这些具有电话本功能的设备上的通讯录和通话记录等信息。角色定义:PSE:Phone Book Server Equipment,拥有电话本源数据的设备,作为服务端,比如手机。PCE:Phone Book Client Equipment,向PSE端请求电话本信息的设备,作为客户端。如手机在与手表/手环连接进行蓝牙通话时,此时手表/手环是PCE ,手机作为PSE。原创 2024-02-25 19:07:44 · 945 阅读 · 0 评论 -
Android
目录一.概述二.Data Format三.数据元2.数据元尺寸描述符 四.Continuation StateThe service discovery protocol (SDP) provides a means for applications to discover which services are available andto determine the characteristics of those available services.基于C/S结构,service通过属性记原创 2024-02-25 19:03:04 · 763 阅读 · 0 评论 -
Android
l2c_link_send_to_lower 把数据交给了 L2C_LINK_SEND_ACL_DATA,L2C_LINK_SEND_ACL_DATA 其实是 bte_main_hci_send 函数,bte_main_hci_send 函数通过调用 hci 的接口 transmit_buf 来转送数据包。下面我们会继续分析这两个函数。注意,如果是 L2CEVT_SEC_COMP 事件(跟安全相关),会把 p_ccb->chnl_state 置为 CST_W4_L2CAP_CONNECT_RSP。原创 2024-02-25 19:06:10 · 855 阅读 · 0 评论 -
Android 蓝牙 整体架构、GAP详解
Core 5.0主要讲的是Bluetooth Architecture 架构部分,161页到264页,最重要的是vol 1 的 part A 部分Architecture 共有7个章节,1,2,3,4,5比较重要最核心需要理清的是2,3章节,第2章节从架构讲了Architecture的一些模块功能角度,第3章节从数据流的角度讲解了数据的传输路线等。蓝牙系统结构的最底层。每个通道由以下几方面组成,一是伪随机序列频率,二是特定的传输时隙,三是访问代码(accesscode)和编码包头。例如手机之间的配对。原创 2024-02-25 19:08:14 · 858 阅读 · 0 评论 -
Android 蓝牙手机侧连接HFP总是失败解析
因此在 bta_hf_client_mgmt_cback() 回调函数中因为连接数已达最大值而导致HFP连接失败,首先会 RFCOMM_RemoveServer() 清除掉此次连接所使用的服务端口,但是没有启动创建新服务端口等待其他连接请求。在bta_hf_client_mgmt_cback()回调中不管连接成功还是失败都重新创建新的服务端口,保证后续AG侧的HFP连接请求都能正常回复。2、bta_hf_client_mgmt_cback()前一个AG侧发起的连接成功后。:Android-9(P版本)原创 2024-02-25 19:03:43 · 386 阅读 · 0 评论 -
Android
AMS 全称 Apple Media Service(苹果媒体服务),是提供给 BLE 设备的一种简单控制媒体应用程序的方式,并且用于获取已连接的 IOS 设备的媒体状态信息。类似于Android 的AVRCP协议。AMS 字节序和字节码除非另有规定,否则通过 AMS 传输的所有数值都应是小端格式。除非另有规定,否则通过 AMS 传输的所有字符串值都应是 UTF-8 编码的 unicode 字符所组成的。依赖性除了标准的通用属性配置文件(GATT)子程序集外,AMS 没有任何依赖性。原创 2024-02-25 19:06:40 · 1039 阅读 · 0 评论 -
Android
在来电时,穿戴设备蓝牙从手机获取联系人信息,然后将其上报给UI进行显示。使用PBAP协议获取Android手机的联系人信息,需要从应用层主动下发拉取联系人的请求;使用ANCS获取IOS手机联系人信息,无需主动下发请求,当IOS手机收到来电时会主动将来电通知推送给手表蓝牙。原创 2024-02-25 19:08:45 · 999 阅读 · 0 评论 -
Android
android/frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java:代表本地蓝牙适配器,是所有蓝牙交互的入口。/android/packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothEnabler.java:蓝牙功能的开启/关闭功能处理。切换状态到mTurningOnState,并且调用其非状态的enter()方法,向上层汇报蓝牙此时状态。原创 2024-02-25 19:04:14 · 389 阅读 · 0 评论 -
Android
首先第一个括号中的是一个函数指针名,顾名思义,应该指向一个函数,通过查找,bta_sys_cb是一个结构体变量,访问到里面的成员reg数组,但是reg又是个结构体指针数组,也就是说evt_hdlr 就是bta_dm_search_sm_execute()函数,并且将参数p_msg传了进来。事件是怎么发送的呢?此时调用到了蓝牙协议栈中btif层了,这个函数的作用是 设备管理相关的函数;() 指向了这个回调函数:那么这个结构体中所有的回调函数在哪里赋值的呢?通过线程,会调用到bta_sys_event函数。原创 2024-02-25 19:01:50 · 958 阅读 · 0 评论 -
Android
今天我们来开设一个AVRCP专题,AVRCP之前我有一篇文章讲解过基本概念,今天这个专题我们具体来看看代码实现。将手机端调节的多媒体音量大小,转化为音频数据的音量增益来间接达到控制音量,并且Device还可以能调节自己的音量。将手机端调节的多媒体音量大小,转化为音频数据的音量增益来间接达到控制音量,且将当前自己的音量等级(volume Level)告知耳机,耳机端会将自己保存的该手机的音量等级(volume Level)改变,耳机只是保存这个level到自己设备中,并不是改变自己本身音量值。原创 2024-02-22 11:05:59 · 363 阅读 · 0 评论 -
Android
1、通话状态有改变,会通过NativeInterface这个类里面的onCallSetup方法。原创 2024-02-23 13:36:24 · 666 阅读 · 0 评论 -
Android
1、判断是否有active link。2、若此刻没有链路,复位buff定额和芯片buff.3、若此刻有链路,分别计算出高--低优先级链路数量4.1如果存在低优先级链路,首先保留1个Buff4.2当高优先级链路数乘以高优先级定额数加上低定额数(至少保证1个buff),大于总的acl 链路buff数量。此时需要将高优先级链路定额buff,依次减少1,直至满足这个while循环。5、计算出高优先级定额总数-高优先级链路数乘以高优先级定额数。原创 2024-02-21 16:47:36 · 487 阅读 · 0 评论 -
Android
IRK(Identity Resolving Key,蓝牙设备地址解析密钥),有些蓝牙设备的地址为可解析的随机地址,由于他们的地址随着时间会变化,那如何确定这些变化的地址都来自同一个设备呢?答案就是IRK,IRK通过解析变化的地址的规律,从而确定这些地址是否来自同一个设备,换句话说,IRK可以用来识别蓝牙设备身份,因此其也称为Identity information。该地址最初是使用此IRK和一个随机数生成的,这类地址会定期更改。以上是通过使用仅可信设备可用的身份解析密钥(IRK)实现的。原创 2024-02-21 16:51:25 · 376 阅读 · 0 评论 -
Android
这两条AVC报错是hal_wifi_default进程没有权限去set vendor.wlan.firmware.version vendor.wlan.driver.version 这两个文件的属性,看上去不影响wifi功能。allow + scontext后面值+tcontext后面值+:+tclass+denied后面的值。创建hal_wifi_default.te文件。目前user 版本无法禁用 seliunx。selinux 的改动一般放在下面目录。直接return false。原创 2024-02-21 16:55:26 · 342 阅读 · 0 评论 -
Android
在调用checkingoutput之前广播调用setparameters去通知通知所有的hardware module,有新的设备正在处理中,不同的hardware module会有不同的操作。通过AudioSystem::setDeviceConnectionState接口将device状态设给policy,用以在路由选择的时候提供device是否可用等信息。之后就是打开了设备等等一系列操作,奈何本博主是个蓝牙开发,之后有时间再研究下河audio有关的这个函数吧。继续再对应的handle中处理此条消息。原创 2024-02-22 11:12:26 · 387 阅读 · 0 评论 -
Android
场景:比如手机和车载连接,在车载端拨号,通过蓝牙将拨号指令传递给手机,手机再处理拨号行为。蓝牙的HFP协议定义了两个角色,一个是HF端,如蓝牙耳机、车机端等免提设备;一个是AG端,通常指的就是手机端。在Android系统里面,也有对应的两个Profile,HF端对应HeadsetClient Profile,而AG端对应Headset Profile。下面我们就通过拨号指令,梳理Headset端的处理过程。原创 2024-02-23 13:36:58 · 710 阅读 · 0 评论 -
Android
本人做手机项目的时候,在ble蓝牙这块有时候很纠结,纠结什么呢?突然有一天功耗组同时告知我,蓝牙在关闭情况下,功耗较高,这我就很纳闷了?蓝牙本就关着,哪来的功耗?后来看HCI日志,发现并没有inquiry扫描,但是有ble扫描,这就很奇怪了,如果没有inquiry,证明在setting中蓝牙开关是关闭的啊,那这个ble扫描从哪里冒出来的呢?原创 2024-02-24 17:57:43 · 341 阅读 · 0 评论 -
Android
在平时工作中,大家都要配置蓝牙nvram 射频参数,但是很多人只知道在什么地方改动,但并不明白代码调用逻辑,在网上也没有讲解,今天我就全面详细的讲解下。先看蓝牙协议栈使能流程:当在UI上打开蓝牙开关,开始ble service使能开始--》创建状态机--》调用到了协议栈接下来开始调用vendor lib 接口了,首先调用init函数,进行读取本机地址和注册回调函数。接下来会去初始化串口,和读取固件配置。原创 2024-02-22 11:08:26 · 409 阅读 · 0 评论 -
Android
最近做了个Android高通项目,今天就来讲讲高通项目在bring up阶段,需要做哪些工作。相比较MTK项目,大家可能对高通项目比较陌生,当然,本人感觉高通项目的支持力度远不及MTK。原创 2024-02-21 16:52:01 · 1054 阅读 · 0 评论 -
Android
HID写数据给Input子节点流程:键盘手柄->按键发送Keycode(HCI)->协议栈(bta_hh_cback()函数)->HID驱动()->Input子节点(getEvnet)原创 2024-02-24 17:58:03 · 421 阅读 · 0 评论 -
Android
以上这些方法都是底层回调数据到上层的方法,这下刚刚的疑惑就得到解决了,那么这个101状态值肯定是必须要走的,期间把event作为传入传递过去了,其中event就包含了state和type信息,记住此时的state为1,type为EVENT_TYPE_AUDIO_STATE_CHANGED,至此源头就找到了,接着回到AudioConnecting连接状态,看如下片段代码。以上就是蓝牙连接到蓝牙断开的七个连接状态,每个状态都继承了状态机,接下来看看每个连接状态的具体方法,具体实现稍后分析。原创 2024-02-24 17:58:50 · 356 阅读 · 0 评论 -
Android
RSSI的单位是dbm,在蓝牙中,我们可以直接理解为,收到蓝牙信号的强度,RSSI = 10*log P,P代表接收到的信号功率,蓝牙会发送广播,距离不同会影响接收到的信号功率,假设发射功率取最大值为1mw,那么RSSI的值为0,也就是说你的距离离蓝牙最近时在理想状态下所获取的RSSI的值为0,但在实际中基本不会存在这个理想状态,因此RSSI的值基本都为负数,而在蓝牙中,当距离很近时,所收到的RSSI的信号值大约在-50dbm。原创 2024-02-23 13:34:49 · 417 阅读 · 0 评论 -
Android
所以一旦P1包发出,主机(手机)即认为连接成功,而不管有没有收到设备的ACK包。,如果手机不开启扫描窗口,手机是收不到设备B的广播的,如下图所示,不仅手机要开启射频接收窗口,而且只有手机的射频接收窗口跟广播发送的发射窗口匹配成功,而且广播射频通道和手机扫描射频通道是同一个通道,手机才能收到设备B的广播信号。由于这种匹配成功是一个概率事件,因此手机扫到设备B也是一个概率事件,也就是说,手机有时会很快扫到设备B,比如只需要一个广播事件,手机有时又会很慢才能扫到设备B,比如需要10个广播事件甚至更多。原创 2024-02-21 16:50:12 · 870 阅读 · 0 评论 -
Android
HOGP写数据给Input子节点流程:键盘手柄->按键发送Keycode(HCI)->协议栈(bta_hh_le_input_rpt_notify()函数)->HID驱动()->Input子节点(getEvnet)原创 2024-02-23 13:40:35 · 560 阅读 · 0 评论 -
Android
今天我们将开一个新的专题 --- OPP文件传输协议,众所周知,蓝牙OPP协议用来手机之间传输文件,虽然我们日常生活中不常用这个功能了,但是作为一名专业蓝牙开发者,还是得熟悉这个协议的源码流程,方便处理OPP相关问题。原创 2024-02-21 16:54:40 · 751 阅读 · 0 评论 -
Android
不管我们使用什么操作系统,无论是 Windows、macOS,还是 Linux ,里面都安装了许多软件、驱动程序和固件。但是,这三者概念有什么区别?简单来讲,原创 2024-02-22 11:05:28 · 324 阅读 · 0 评论 -
Android
其中packagename.classname是Java代码编译后的.class文件,而在生成的output.h文件里,声明了对应JNI函数,只要实现里面的函数即可。下面主要讲一下动态注册,动态注册比较方便jni的移植,而静态注册如果移植到其他的packet,需要修改所有的jni函数名.加载的效率上,动态注册也优于静态注册。Java支持函数重载,可以定义相同方法名,但是不同参数的方法,然后Java根据其不同的参数,找到其对应的实现的方法.在jni的文件中重载JNI_OnLoad函数。1、获取JNIEnv。原创 2024-02-23 13:35:23 · 599 阅读 · 0 评论 -
Android
setActiveDevice->src_set_active_sink,具体的协议栈连接流程请看文首连接。当A2DP协议连接成功后,会收到广播:MESSAGE_A2DP_ACTION_CONNECTION_STATE_CHANGED,此时状态机变为conencted.在这个函数中发送了广播:BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED。获取到active设备,设置为全局变量,这里就只有这个操作,没有其他操作了。audio收到a2dp连接成功后的通知,打开输出设备。原创 2024-02-22 11:09:35 · 391 阅读 · 0 评论 -
Android
HFP SLC连接成功后,状态转变为connected,然后开始设置device为active状态,同时获取硬件模块。原创 2024-02-22 11:11:55 · 820 阅读 · 0 评论 -
Android
实际上我们在之前分析过,在打开蓝牙的过程中,首先就是打开BLE,在Android系统中对应的就是GattService;再打开BLE之后,再去打开其他的Profile服务,所有Profile服务开启完毕之后,再通过广播形式通知蓝牙开关打开成功。最近有一个功能需要使用蓝牙BLE,如果在使用之前蓝牙是关闭的状态,需要先打开蓝牙,并且在使用完之后,需要把蓝牙关闭。于是决定本功能模块单独使用蓝牙BLE,而不去操作经典蓝牙,这样就不会影响到设置模块对蓝牙开关的操作逻辑了。原创 2024-02-23 13:35:54 · 338 阅读 · 0 评论 -
Android
HFP的连接流程我们在前几章已经讲过了,今天我们就继续深入探究下,HFP连接过程中,Device端调节音量,那么这个流程什么样子呢?手机端会有什么反应呢?这个和播放音乐时候调节音量有什么区别?首先得知道,播放音乐时候调节音量走的是AVRCP协议中的绝对音量这个概念,而通话过程中,是通过RFcomm 协议的AT 指令交互来进行的,两者有本质的区别,所以这个大的前提大家要搞清楚。原创 2024-02-22 11:07:55 · 381 阅读 · 0 评论 -
Android
当过程完成时,AVDT_RECONFIG_CFM EVT通过该句柄的控制回调函数发送给应用程序。这允许应用程序在流终端被打开后更改其编解码器或内容保护功能。这个函数只能在流打开但没有启动或者流被挂起的情况下调用。调用到了蓝牙协议栈btif层。原创 2024-02-21 16:50:48 · 313 阅读 · 0 评论 -
Android
Bluetooth协议栈的AdapterService在接收到onLeServiceUp的调用之后,会给AdapterState状态机发一条AdapterState.USER_TURN_ON的消息,于是这次操作又交到了AdapterState状态机去处理了。至此,从应用调用打开蓝牙的方法,到收到蓝牙打开的广播,整个蓝牙打开的流程就已经分析完毕!每一个服务启动后,都会通知到AdapterService,当所有的协议服务都启动完毕之后,也就意味着蓝牙真正的打开了。蓝牙进程使用 JNI 与蓝牙。原创 2024-02-24 18:03:01 · 372 阅读 · 0 评论 -
Android
同学,别退出呀,我可是全网最牛逼的 Android 蓝牙分析博主,我写了上百篇蓝牙文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。原创 2024-02-21 16:53:08 · 394 阅读 · 0 评论