1.谁有FreeBSD的蓝牙蓝牙使用手册啊?
2.蓝牙耳机有监听功能吗?
3.微信小程序/uni-app 蓝牙打印开发教程和常见问题总结文末附源码
4.连接蓝牙需要的PIN码是什么?
谁有FreeBSD的使用手册啊?
.4 拨入服务
Contributed by Guy Helmer. Additions by Sean Kelly.
为拨入服务配置FreeBSD系统与连接到终端是非常相似的,除非您正在使用 modem来拨号而不是打印打印终端。
.4.1 外置vs.内置modem
外置modem看起来很容易拨号。源码源码 因为,蓝牙蓝牙外置 modem 可以通过储存在非易失性的打印打印RAM中的参数来配置,它们通常提供指示器来显示重要的源码源码2345刷分源码RS-信号的状态。不停闪光的蓝牙蓝牙信号灯能给用户留下比较深刻的印象,而且指示器也可以用来查看modem是打印打印否正常地工作。
内置modem通常缺乏非易失性的源码源码RAM, 所以对它们的蓝牙蓝牙配置可能会限制在通过 DIP 开关来设置。如果您的打印打印内置modem有指示灯,您也很难看得到。源码源码
.4.1.1 Modem和线缆
如果您使用一个外置的蓝牙蓝牙 modem,那您将需要适当的打印打印电缆线。一个标准的源码源码串口线应当足够长以至普通的信号能够连接上:
表 -4. 信号名称
缩写 全名
RD 收到数据 (Received Data)
TD 传出数据 (Transmitted Data)
DTR 数据终端就绪 (Data Terminal Ready)
DSR 数据集就绪 (Data Set Ready)
DCD 数据载波检测 (Data Carrier Detect) (RS- 的收到线路信号检测器)
SG 信号地 (Signal Ground)
RTS 要求发送数据 (Request to Send)
CTS 允许对方发送数据 (Clear to Send)
FreeBSD 对速度超过 bps 的情形需要通过 RTS 和 CTS 信号来完成流控制, 通过 CD 信号来检测呼叫响应和挂机,并通过 DTR 信号来在会话结束时对调制解调器进行复位。某些电缆在连接时没有提供全部需要的信号, 这会给您带来问题, 例如在挂断时登录会话不消失,这就有可能是电缆的问题。
与其它类 UNIX? 操作系统类似, FreeBSD 使用硬件信号来检测呼叫响应, 以及在挂断时挂断并复位调制解调器。 FreeBSD 避免发送命令给调制解调器, 或监视其状态。 如果您熟悉通过调制解调器来连接基于 PC 的 BBS 系统, 这可能看起来有点难用。
.4.2 串口的考虑
FreeBSD支持基于 NS, NS, NS 和 NSA 的EIA RS-C通讯接口。 和设备有单字符缓冲。 设备提供了一个 个字符的缓冲,可以提高更多的系统性能。 因为单字符缓冲设备比 个字符的缓冲需要更多的系统资源来工作,所以基于A的接口卡可能更好。 如果系统没有活动的串口, 或有较大的负载, 字符缓冲的卡对于低错误率的通讯来说更好。
.4.3 快速预览
对于终端, init 会在每个配置串口上为每个拨入连接产生一个 getty 进程。 例如, 如果一个 modem 被附带在 /dev/ttyd0 中,用命令ps ax可以显示下面这些:
I 0:. /usr/libexec/getty V ttyd0
当用户拨上modem, 并使用它进行连接时, CD 线就会被 modem 认出。 内核注意到载波信号已经被检测到,旅店管理系统源码 需要完成 getty 端口的打开。 getty 发送一个登录:在指定的初始线速度上的命令行。 Getty 会检查合法的字符是否被接收,在典型的配置中, 如果发现 “垃圾”, getty 就会设法调节线速度,直到它接收到合理的字符。
用户在键入他/她的登录名称后, getty执行/usr/bin/login, 这会要求用户输入密码来完成登录,然后启动用户的shell。
.4.4 配置文件
如果希望允许拨入您的 FreeBSD 系统, 在 /etc 目录中有三个系统配置文件需要您关注。 其一是 /etc/gettytab,其中包含用于 /usr/libexec/getty 服务的配置信息。 其二是 /etc/ttys, 它的作用是告诉 /sbin/init 哪些 tty 设备上应该运行 getty。 最后,关于端口的初始化命令, 应放到 /etc/rc.d/serial 脚本中。
关于在 UNIX 上配置拨入调制解调器有两种主要的流派。一种是将本地计算机到调制解调器的 RS- 接口配置为固定速率。 这样做的好处是,远程用户总能立即见到系统的登录提示符, 而其缺点则是,系统并不知道用户真实的数据速率是多少, 因而, 类似 Emacs 这样的程序, 也就无法调整它们绘制屏幕的方式, 以便为慢速连接改善响应时间。
另一种流派将调制解调器的 RS- 接口速率配置为随远程用户的连接速率变化。 例如, 对 V.bis (.4 Kbps) 连接, 调制解调器会让自己的 RS- 接口以 .2 Kbps 的速率运行, 而 bps 连接, 则会使调制解调器的 RS- 接口以 bps 的速率运行。 由于 getty 并不能识别具体的调制解调器的连接速率反馈信息, 因此, getty 会以初始速度给出一个 login: 提示, 并检查用户的响应字符。如果用户看到乱码, 则他们应知道此时应按下 Enter 键,直到看到可以辨认的提示符为止。 如果数据速率不匹配, 则 getty 会将用户输入的任何信息均视为 “乱码”, 并尝试以下一种速率来再次给出 login: 提示符。17做网店源码 这一过程可能需要令人作呕地重复下去, 不过一般而言,用户只要敲一两下键盘就能看到正确的提示符了。 显然, 这种登录过程看起来不如前面所介绍的 “锁定速率” 方法那样简单明了, 但使用低速连接的用户,却可以在运行全屏幕程序时得到更好的交互响应。
这一节将尽可能公平地介绍关于配置的信息,但更着力于介绍调制解调器速率随连接速率变化的配置方法。
.4.4.1 /etc/gettytab
/etc/gettytab是一个用来配置 getty 信息的 termcap 风格的文件。 请看看 gettytab 的联机手册了解完整的文件格式和功能列表。
.4.4.1.1 锁定速度的配置
如果您把您的modem的数据通讯率锁定在一个特殊的速度上, 您不需要对 /etc/gettytab 文件作任何变化。
.4.4.1.2 匹配速度的配置
您将需要在 /etc/gettytab 中设置一个记录来告诉 getty 您希望在 modem 上使用的速度。 如果您的 modem 的速率是 bit/s, 则可以使用现有的 D 的记录。
#
# Fast dialup terminals, // rotary (can start either way)
#
D|d|Fast-Dial-:\
:nx=D:tc=-baud:
3|D|Fast-Dial-:\
:nx=D:tc=-baud:
5|D|Fast-Dial-:\
:nx=D:tc=-baud:
如果您有一个更高速度的 modem, 必须在 /etc/gettytab 中添加一个记录。 下面是一个让您可以以最高 .2 Kbit/s 的用在 .4 Kbit/s的modem上的接口记录:
#
# Additions for a V.bis Modem
#
um|V|High Speed Modem at ,8-bit:\
:nx=V:tc=std.:
un|V|High Speed Modem at ,8-bit:\
:nx=V:tc=std.:
uo|V|High Speed Modem at ,8-bit:\
:nx=V:tc=std.:
up|V|High Speed Modem at ,8-bit:\
:nx=V:tc=std.:
uq|V|High Speed Modem at ,8-bit:\
:nx=V:tc=std.:
这样做的结果是 8-数据位, 没有奇偶校验的连接。
上面使用.2 Kbit/s的连接速度的例子,也可以使用 bit/s (for V.), bit/s, bit/s, bit/s, 直到 .2 Kbit/s。 通讯率的调节使用 nx= (“next table”) 来实现。 每条线使用一个 tc= (“table continuation”) 的记录来加速对于一个特殊传输率的标准设置。
如果您有.8 Kbit/s的modem,或您想使用它的 .4Kbit/s 模式,就需要使用一个更高的超过 .2 Kbit/s 的通讯速度的 modem。 这是一个启动 .6 Kbit/s 的 gettytab 记录的例子:
#
# Additions for a V.bis or V. Modem
# Starting at .6 Kbps
#
vm|VH|Very High Speed Modem at ,8-bit:\
:nx=VH:tc=std.:
vn|VH|Very High Speed Modem at ,8-bit:\
:nx=VH:tc=std.:
vo|VH|Very High Speed Modem at ,8-bit:\
:nx=VH:tc=std.:
vp|VH|Very High Speed Modem at ,8-bit:\
:nx=VH:tc=std.:
vq|VH|Very High Speed Modem at ,8-bit:\
:nx=VH:tc=std.:
如果您的 CPU 速度较低, 或系统的负荷很重, 而且没有 A 的串口,您可能会在.6 Kbit/s 上得到 “sio” “silo”错误。
.4.4.2 /etc/ttys
/etc/ttys文件的配置在 例 -1中介绍过。 配置 modem 是相似的, 但我们必须指定一个不同的终端类型。锁定速度和匹配速度配置的通用格式是:
ttyd0 "/usr/libexec/getty xxx" dialup on
上面的第一条是这个记录的设备特定文件 —— ttyd0 表示 /dev/ttyd0 是这个 getty 将被监视的文件。 第二条 "/usr/libexec/getty xxx" 是将运行在设备上的进程 init。 第三条,dialup,是默认的终端类型。 第四个参数, on, 指出了线路是android短信备份源码可操作的 init。也可能会有第五个参数, secure, 但它将只被用作拥有物理安全的终端 (如系统终端)。
默认的终端类型可能依赖于本地参考。 拨号是传统的默认终端类型,以至用户可以定制它们的登录脚本来注意终端什么时候拨号, 和自动调节它们的终端类型。 然而,作者发现它很容易在它的站点上指定 vt 作为默认的终端类型,因为用户刚才在它们的远程系统上使用的是VT模拟器。
您对/etc/ttys作修改之后,您可以发送 init 进程给一个 HUP 信号来重读文件。您可以使用下面的命令来发送信号:
# kill -HUP 1
如果这是您的第一次设置系统, 您可能要在发信号 init 之前等一下,等到您的 modem 正确地配置并连接好。
.4.4.2.1 锁定速度的配置
对于一个锁定速度的配置,您的 ttys 记录必须有一个为 getty 提供固定速度的记录。 对于一个速度被锁定在 .2kbit/s 的 modem, ttys 记录是这样的:
ttyd0 "/usr/libexec/getty std." dialup on
如果您的 modem 被锁定在一个不同的数据速度, 为 std.speed 使用适当的速度来代替 std.。 确信您使用了一个在 /etc/gettytab 中列出的正确的类型。
.4.4.2.2 匹配速度的设置
在一个匹配速度的设置中,您的 ttys 录需要参考在 /etc/gettytab 适当的起始 “auto-baud” 记录。 例如, 如果您为一个以 .2 Kbit/s 开始的可匹配速度的 modem 添加上面建议的记录, 您的 ttys 记录可能是这样的:
ttyd0 "/usr/libexec/getty V" dialup on
.4.4.3 /etc/rc.d/serial
高速调制解调器, 如使用 V.、 V.bis, 以及 V. 的那些, 需要使用硬件 (RTS/CTS) 流控制。 您可以在 /etc/rc.d/serial 中增加 stty 命令来在 FreeBSD 内核中, 为调制解调器设置硬件流控制标志。
例如, 在 1 号串口 (COM2) 拨入和拨出设备上配置 termios 标志 crtscts, 可以通过在 /etc/rc.d/serial 增加下面的设置来实现:
# Serial port initial configuration
stty -f /dev/ttyd1.init crtscts
stty -f /dev/cuad1.init crtscts
.4.5 Modem 设置
如果您有一个 modem, 它的参数能被存储在非易失性的 RAM 中,您将必须使用一个终端程序来设置参数 (比如 MS-DOS? 下的 Telix 或者 FreeBSD 下的 tip)。使用同样的通讯速度来连接 modem 作为初始速度 getty 将使用和配置 modem 的非易失性 RAM 来适应这些要求:
连接时宣告 CD
操作时宣告 DTR; DTR 消失时挂断线路并复位调制解调器
CTS 传输数据流控制
禁用 XON/XOFF 流控制
RTS 接收数据流控制
宁静模式 (无返回码)
无命令回显
请阅读您 modem 的文档找到您需要用什么命令和 DIP 接口设置。
例如,要在一个 U.S. Robotics? Sportster? 的外置 modem 上设置上面的参数,可以用下面这些命令:
ATZ
AT&C1&D2&H1&I0&R2&W
您也可能想要在 modem 上寻找机会调节这个设置, 例如它是否使用 V.bis 和 MNP5 压缩。
外置 modem 也有一些用来设置的 DIP 开关, 也许您可以使用这些设置作为一个例子:
Switch 1: UP —— DTR Normal
Switch 2: N/A (Verbal Result Codes/Numeric Result Codes)
Switch 3: UP —— Suppress Result Codes
Switch 4: DOWN —— No echo, offline commands
Switch 5: UP —— Auto Answer
Switch 6: UP —— Carrier Detect Normal
Switch 7: UP —— Load NVRAM Defaults
Switch 8: N/A (Smart Mode/Dumb Mode)
在拨号 modem 上的结果代码应该被 禁用/抑制, 以避免当 getty 在 modem 处于命令模式并回显输入时错误地给出 login: 提示时可能造成的问题。 这样可能导致 getty 与 modem 之间产生更长的android 横屏源码不必要交互。
.4.5.1 锁定速度的配置
对于锁定速度的配置, 您需要配置 modem 来获得一个不依赖于通讯率的稳定的 modem到计算机 的传输率。 在一个 U.S. Robotics Sportster 外置 modem 上, 这些命令将锁定 modem 到计算机的传输率:
ATZ
AT&B1&W
.4.5.2 匹配速度的配置
对于一个变速的配置, 您需要配置 modem 调节它的串口传输率匹配接收的传输率。 在一个 U.S. Robotics Sportster 的外置 modem 上, 这些命令将锁定 modem 的错误修正传输率适合命令要求的速度,但允许串口速度适应没有纠错的连接:
ATZ
AT&B2&W
.4.5.3 检查modem的配置
大多数高速的modem提供了用来查看当前操作参数的命令。 在USR Sportster 外置modem上, 命令 ATI5 显示了存储在非易失性RAM中的设置。要看看正确的 modem 操作参数, 可以使用命令 ATZ 然后是 ATI4。
如果您有一个不同牌子的 modem, 检查 modem 的使用手册看看如何双重检查您的 modem 的配置参数。
.4.6 问题解答
这儿是几个检查拨号modem的步骤。
.4.6.1 检查FreeBSD系统
把您的modem连接到FreeBSD系统, 启动系统, 然后, 如果您的 modem 有一个指示灯,当登录时看看 modem 的 DTR 指示灯是否亮: 会在系统控制台出现命令行——如果它亮, 意味着 FreeBSD 已经在适当的通讯端口启动了一个 getty 进程, 等待 modem 接收一个呼叫。
如果DTR指示灯不亮, 通过控制台登录到 FreeBSD系统,然后执行一个 ps ax 命令来看 FreeBSD 是否正在正确的端口运行 getty进程。您将在进程显示中看到像这样的一行:
I 0:. /usr/libexec/getty V ttyd0
I 0:. /usr/libexec/getty V ttyd1
如果您看到是这样的:
d0 I 0:. /usr/libexec/getty V ttyd0
modem 不接收呼叫, 这意味着 getty 已经在通讯端口打开了。这可以指出线缆有问题或 modem 错误配置, 因为 getty 无法打开通讯端口。
如果您没有看到任何 getty 进程等待打开想要的 ttydN 端口, 在 /etc/ttys 中双击您的记录看看那儿是否有错误。 另外,检查日志文件 /var/log/messages 看看是否有一些来自 init 或 getty 的问题日志。 如果有任何信息, 仔细检查配置文件 /etc/ttys 和 /etc/gettytab,还有相应的设备文件 /dev/ttydN,是否有错误,丢失记录,或丢失了设备指定文件。
.4.6.2 尝试接入Try Dialing In
设法拨入系统。 确信使用8位, 没有奇偶检验, 在远程系统上的1阻止位。如果您不能立刻得到一个命令行, 试试每隔一秒按一下 Enter。如果您仍没有看到一个登录: 设法发送一个 BREAK。如果您正使用一个高速的 modem 来拨号, 请在锁定拨号 modem 的接口速度后再试试。
如果您不能得到一个登录:prompt,再检查一下 /etc/gettytab,重复检查:
在/etc/ttys 中指定的初始可用的名称与 /etc/gettytab 的一个可用的相匹配。
每个 nx= 记录与另一个 gettytab 可用名称匹配。
每个 tc= 记录与另一个 gettytab可用名称相匹配。
如果您拨号但 FreeBSD 系统上的 modem 没有回应, 确信 modem 能回应电话。 如果 modem 看起来配置正确了, 通过检查 modem 的指示灯来确认 DTR 线连接正确。
如果您做了好几次,它仍然无法工作,打断一会,等会再试试。 如果还不能工作,也许您应该发一封电子邮件给 FreeBSD 一般问题邮件列表 寻求帮助。
蓝牙耳机有监听功能吗?
1.蓝牙耳机的使用
蓝牙耳机的使用说明书中都会有相关的详细使用说明,这里拣重点说明一下。除了电源开关,耳机上一般有三个键。如下所示:
它们每个都是多功能键,在不同的情况下有不同的功能。1号键的功能包括:开始播放音乐/停止插入音乐/接听电话/挂断电话;2号键的功能有:增加音量/上一曲;3号键的功能有 减小音量/下一曲。
注:暂不包括通话模式;其它型号蓝牙耳机并不一定完全相同。
2.蓝牙耳机上的按键实现原理
试用后会明白,一个按键会有多个功能,那么在Android系统中是如何表示的呢?其实对于Android系统,每次按键只会有一个唯一「键值」响应,使用起来感觉会模模糊糊的,但是其实对于系统来说是很清晰的。
AVRCP全称(Audio/Video Remote Control Profile),是蓝牙协议中的一个profile。从名字上就可以看出主要应用于Audio/Video控制。每个按键并不是独立的,上-曲/下一曲是在正在播放音乐的时候才会有效,即才会向Android发送「键值」。
基于按键从Linux到Android分析具体对于的键值:
Linux扫描码 功能 映射字串 Android键值
c8 开始放音乐 MEDIA_PLAY KEYCODE_MEDIA_PLAY
c9 停止放音乐 MEDIA_PAUSE KEYCODE_MEDIA_PAUSE
a3 下一曲 MEDIA_NEXT KEYCODE_MEDIA_NEXT
a5 上-曲 MEDIA_PREVIOUS KEYCODE_MEDIA_PREVIOUS
Android应用代码,完整测试应用:TeskKey。
总结:1号键会交替发送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE;2/3号键会在播放音乐时分别发送KEYCODE_MEDIA_PREVIOUS/.KEYCODE_MEDIA_NEXT。如果想要把蓝牙耳机上的按键利用起来,可以在接收到KEYCODE_MEDIA_PLAY时播放 无声音乐 以使能2/3号键。这样就能完整接收3种键值了自行控制了。这个具体自行设计(测试代码已经更新包含了)。
注:这种实现并不一定通用,比如我在深度定制的MIUI中测试,尽管启动的TestKey应用,系统自带的音乐播放器仍然能同时响应键值。
更新:
已经更新TestKey源码,添加对蓝牙耳机按键的监听,实现方法就是上述中推测的方法,已经成功验证过了。播放音乐参考《Android多媒体开发--资源文件播放》。效果图:
需要说明一点的是,程序带了两个音乐文件在/res/raw中,默认播放的是lapple.mp3一个有声音的mp3音乐文件,silencesec.mp3是一个无声音的秒钟音乐文件,实际应用中可以使用它。
问与答
1.这个只能在播放音乐的状态下才能监听到么?
答:根据上述的原理,这些按键也仅仅是应用在控制媒体时使用;且根据实际验证没有播放音乐时蓝牙耳机的2/3号键是并没有向Android设备发送键值(从底层Linux来看)。综上所述,需要通过播放音乐来实现激活其向Android设备发送键值,针对这种情况可以播放一个「没有声音」的音乐文件来实现,这样既可以监听到2/3号键又可以不影响其它声音的输出。可以在前台时播放音乐,后台停止播放。
2.我现在主要是想监听得到开关键(1号键)。 在做一个按下蓝牙开关键后启动一个语音识别的功能?
答:在我的测试条件下,1号键是可以正常监听到的。1号键会交替发送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE键值。这个键不需要模拟播放音乐就可以正常的监听到。
3. 4号按键的监听方法
答:所谓的4号按键,也就是指本文中的所测试型号的蓝牙耳机上并没有,但有可能其它型号的蓝牙耳机上有。我没有办法测试验证,所以这里就简单叙述一下「新按键」的键值确定思路:1.先使用TestKey测试应用测试按键,测试Android上层是否可以得到对应键值。2.如果没有得到,那么就使用adb shell getevent来看Linux底层可以不可以得到键值。然后根据按键从Linux到Android来确定Android上层使用的键值码到底是多少。(当然,如果你实在不知道如何监听,把蓝牙耳机寄给我,我给你确定也行。:))
注:其实上述文章完全是根据按键从Linux到Android测试确定下来的。那是篇文章是剥开Android外壳来看「按键」事件的流程的,方法适用于所有输入事件:各种按键/触摸/物理键盘/鼠标等待输入设备。没有一定的Linux开发经验很难看懂和理解。
4. Android后台监听按键怎么实现
或:如何启动一次应用后在后台一直监听播放键 因为有这样一个场景 在用户开车的时候需按一下开关键就启动语音识别的功能。
这个问题其实已经超出了本文讨论的范围,是Android系统对应用层的键盘事件(按键)的分发的问题了。正常情况下,按键只会向当前最端的应用分发键盘事件,也就是说在后台你边音量键都监听不了。
但是既然这种情况(后台应用监听按键)的需求存在,那么就一定有它存在的道理。比如「相机键」,按下后直接调出相机到最前台。从表面上看是相机响应了按键,但是从实现方法上来看,并不是通过键值来操作,必须通过其它方法,比如广播或者其它等等。
明白了其中的道理后,那么想要实现就好办了。先看这个按键有没有广播,如要有接听系统中发出来的广播;如果没有那么对于定制系统可以自己在系统中添加一个广播;总之,正常渠道是没有办法在后台监听一些不应该是你监听到的按键的。
更:查了一下,这个按键是有广播的。这样就可以后台响应了(不需要C/不需要root)。例子我就不试了,见Android官方例子RandomMusicPlayer。
其中的重点是这个广播android.intent.action.MEDIA_BUTTON。
更:
本来不想再更新那个Testkey了,好吧,我还是更新了一下,关于后台监听媒体相关按键的方法。没有在界面上更新,通过LogCat查看打印信息。
上述内容算「鱼」,下边把「渔」也提供了:
第一步先直接编译运行RandomMusicPlayer,然后发现确实不能收到广播,然后判断是系统版本问题,有可能是RandomMusicPlayer并没有更新为适合4.0以上的。在Capture media button on Android >=4.0 (works on 2.3)这里找到了问题所在,添加之成功。然后整合到Testkey上,具体改了哪些内容通过Github上的commit id查看。
更:
关于测试程序的源码,是托管在Github上的,文中找到"TestKey"链接,打开后如下图下载:
APK下载
更新源码,添加编译好的APK文件。
直接下载地址:/kangear/TestKey/raw/master/apk/TestKey.apk
更:
已经root的Android设备获取键值方法
如果设备已经root过了,那么可以更底层地获取键值。
1.下载终端模拟器/soft/item?docid=
2.运行su -c getevent 然后按下需要测试的按键 注:su -c getevent中间有空格.
3.会有如下输出,其中每次按下后输出数据的倒数第二行 倒数第二个是该按键的原始键值
4.将此键值告知我,我来判断如何实现相应功能
注:
1.该命令会监听所有输入事件 触摸屏/按键/蓝牙耳机/鼠标键盘 都会检测到,所以输出命令后不要再点击触摸屏 不然会有大量输出.
2.一般情况下每次按键会输出4行信息.
3.下图最后输出4行是按下 Vol- 的输出.如果你的测试没有达到这个效果,要自行去对比哪里出现了问题.
4.以下监听蓝牙按键的实例
更:
哪些键值会是蓝牙传递过来的
1. 连接蓝牙后,如果直接按下蓝牙耳机上的某个键,你的手机会自动播放音乐,那么说明是该键值是从蓝牙耳机传递过来的.
2. 播放音乐后,如果可以仅仅通过蓝牙耳机上的某个键,你的手机会切换音乐,那么说明是该键值是从蓝牙耳机传递过来的.
3. 播放音乐时,如果可以仅仅通过蓝牙耳机上的某个键,你的手机屏幕上显示增大或者减小音量,那么说明该键值是从蓝牙耳机传递过来的.反之如果只是蓝牙耳机内部音量进行了改变,Android没有任何的反应,那么说明该按键仅仅有控制蓝牙耳机音量的功能,并没有向Android上报键值.
4. 连接蓝牙通话,如果通过按下某个键,可以挂断电话,那么说明该按键是从蓝牙耳机传递过来的.
案例:
a.某个4.0版本协议的蓝牙耳机更注重省电,在控制音量时只是自身喇叭音量增大或者减小,并不是向Android系统报告需要增大或者减小音量的,那么说明这个按键根本从来就没有向Android报告过键值.(无按键上传)
b.某些型号的蓝牙耳机,本身不控制音量,当按下按下音量键时,会将键值传递给Android设备,要求Android进行增大或者减小音频源的音量 来实现音量的控制.(有按键上传)
以上两种情况,虽然用户体验是并无太大差别,但是实现原理极为不同的.
补充知识:
播放音量/音频通话是蓝牙耳机中两个不同的规范,一般情况下都会同时支持,但是有时候会仅仅支持后者(也称 单声道蓝牙耳机),为的是更省电.当然也会进一步压缩一些功能.
更 单通道耳机不能使用上述方法检测按键分析
蓝牙标准规范列表:https://en.wikipedia.org/wiki/List_of_Bluetooth_profiles
这里说明几个常用的规范:(规范也可以理解为通道)
1._正常_播放音乐
2._正常_播放音乐时按键
3.语音通话/以及语音通话时按键
注:对于单声道耳机(默认只能接听电话)通过某些软件实现的播放音乐的原理是将「音乐的信号」通过「语音通话通道」传输给耳机的。耳机实质还是工作在「语音通话」模式下。
说一千道一万,对于第三种情况下的非按键的按键如何检测,且听下回分解。;)
这里简单推测一下原理,第3种情况下"按键"是被包括在通话语音信号中的,应该是直接被Phone应用解析并进行了相应操作。Android4.2以上的版本中会有一个内置的无界面的应用程序名字叫Bluetooth.apk,它是Android系统对中蓝牙设备支持的核心,所有的规范(profile)都是通过它来解析的。所以要研究一下它和Phone应用之间做了什么见不得人的勾当才能知道如何。 ;)
当然简单一点,也可以通过监听音量变化也实现曲线监听等等,不过这个不是我研究的重点。
另外一点是 对于单声道耳机按键研究 目前也只能是挖的一个坑。什么时候埋暂时不好说。
先写到这里 (语音通话时“按键”处理过程)
文字描述:已经找到处理过程,和推测的一致。Bluetooth解析出特定的“按键”后直接进行处理,没有向外界通知什么。根据高亮的英文也能猜测出含意。第一张图是语音通话时的各种“按键”事件,第二张图是对“拨号/重拨”键的处理。高亮出是重拨时获取通话记录中最后一个号码。如果可以访问Google那么你也可以直接在线查看我截图的这两段代码片段。HeadsetStateMachine.java(另:我是基于4.2.2分析的),这是简单的分析过程,对于如何在APP中监听,下回再说。
微信小程序/uni-app 蓝牙打印开发教程和常见问题总结文末附源码
由于业务需求,我们的应用需要集成数据打印功能。项目基于uni-app开发,并最终发布为微信小程序。在查阅了官方开发文档后,了解到技术实现是可行的。同时,我们向蓝牙打印机的卖家确认了设备的自定义开发能力,并最终选择了支持标签模式和票据模式的佳博GP--TU系列蓝牙打印机。
在集成蓝牙打印功能的过程中,我们首先梳理了连接蓝牙并执行打印操作的流程。微信小程序和uni-app在连接蓝牙的操作和API接口上遵循相似规范,但接口对象有所不同。微信小程序接口挂载于wx对象上,而uni-app则挂载在uni对象上。
为了实现这一功能,我们详细规划了连接蓝牙设备的过程。首先,需要确保蓝牙适配器已打开,并正确初始化蓝牙模块。由于涉及到系统的特殊性,如Android8.0+系统需开启定位功能,我们在连接蓝牙前进行了必要的准备。
连接蓝牙设备的步骤包括:
1. 打开蓝牙适配器,确保后续操作可以执行。
2. 检查蓝牙状态,确保设备能够被正确识别。
3. 使用uni.startBluetoothDevicesDiscovery接口搜索附近可用的蓝牙设备。
4. 通过uni.getBluetoothDevices接口获取发现的设备列表,并可能需要监听新设备的发现事件。
5. 使用uni.writeBLECharacteristicValue接口向设备发送打印指令。
我们还特别注意了不同类型的蓝牙打印机(如标签打印机和票据打印机)可能使用不同的指令集,如TSC指令集或ESC指令集。为了简化操作,通常打印机制造商会提供封装好的SDK文件,用于将文本和指令组合成可识别的指令字符串。
为了方便用户,我们提供了完成的源码。用户只需扫描二维码关注并回复特定关键词,即可获取uni-app和微信小程序的蓝牙打印机源码。这使得开发人员能够快速集成打印功能,并通过测试界面和打印效果展示进行验证。
通过遵循上述步骤和利用提供的源码,开发者可以顺利地在uni-app或微信小程序中集成蓝牙打印功能,满足业务需求。
连接蓝牙需要的PIN码是什么?
为保护您的使用安全,联通SIM卡采用PIN码和PUK码保护。当PIN码输错3次后,SIM卡会自动上锁,手机提示“SIM卡已锁”;SIM卡被锁后,需要输入PUK才能解锁,您可登录手机营业厅点击“我的联通”>“安全中心”>“我的PUK码”,即可查询PUK码。
温馨提示:
1.PIN码的初始密码是,如PUK码连续输错次,SIM卡将会报废,需要补卡后才能继续使用;
2.手机营业厅的具体功能和操作路径以实际页面为准。