androidat命令
① android添加蓝牙电量
1. HFP 命令AT+IPHONEACCEV
描述:报告耳机的状态变更
发起者:耳机
格式:AT+IPHONEACCEV=[Number of key/value pairs ],[key1 ],[val1 ],[key2
],[val2 ],…
参数:
Number of key/value pairs :接下来参数的数量
key:被报告状态变化的类型
1 =电量等级
2 =暂停状态
val:更改的值
Battery events:0-9之间数字的字符串 A
string value between ‘0’ and ‘9’.
Dock state: 0 = undocked, 1 = docked.
Example:AT+IPHONEACCEV=1,1,3
2.android framework 修改点
packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
BluetoothAssignedNumbers.APPLE可以随便用哪个公司的,但注册广播时要一致就行。
static {
classInitNative();
型乱磨 VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID = new HashMap();
VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID.put("+XEVENT",BluetoothAssignedNumbers.PLANTRONICS);
VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID.put("+ANDROID",BluetoothAssignedNumbers.GOOGLE); 陪绝 +VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID.put("+XAPL",BluetoothAssignedNumbers.APPLE);
+VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID.put("+IPHONEACCEV",BluetoothAssignedNumbers.APPLE);
}
获取蓝牙电量需要向蓝牙发送回复的at命令:
private (String atString) {
log("processVendorSpecificAt - atString = " + atString);
// Currently we accept only SET type commands.
int indexOfEqual = atString.indexOf("=");
if (indexOfEqual == -1) {
Log.e(TAG, "processVendorSpecificAt: command type error in " +atString);
return false;
}
String command = atString.substring(0, indexOfEqual);
Integer companyId = VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID.get(command);
if (companyId == null) {
Log.e(TAG, "processVendorSpecificAt: unsupported command: " +atString);
卜斗 return false;
}
String arg = atString.substring(indexOfEqual + 1);
if (arg.startsWith("?")) {
Log.e(TAG, "processVendorSpecificAt: command type error in " +atString);
return false;
}
Object[] args = generateArgs(arg);
+ if ("+XAPL".equals(command)) {
+ processAtXapl(args);
+ }
(command,
companyId,
BluetoothHeadset.AT_CMD_TYPE_SET,
args,
mCurrentDevice);
atResponseCodeNative(HeadsetHalConstants.AT_RESPONSE_OK, 0);
return true;
}
/**
* Process AT+XAPL AT command
* @param args command arguments after theequal sign
* @param device Remote device that hassent this command
*/
private void processAtXapl(Object[] args){
if (args.length != 2) {
Log.w(TAG, "processAtXapl()args length must be 2: " + String.valueOf(args.length));
return;
}
if (!(args[0] instanceof String) ||!(args[1] instanceof Integer)) {
Log.w(TAG, "processAtXapl()argument types not match");
return;
}
// feature = 2 indicates that wesupport battery level reporting only
Log.d("tsq77","+XAPL=iPhone,");
atResponseStringNative("+XAPL=iPhone," + String.valueOf(2));
}
2.上层app监听广播获取电量
packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothSettings.java
在settings中的蓝牙界面中注册广播,然后把电量显示出来。
//aaron
IntentFilter filter=new IntentFilter();
filter.addAction(BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT);
//filter.addCategory(BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY+"."+BluetoothAssignedNumbers.
APPLE);
filter.addCategory(BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY+"."+BluetoothAssignedNumbers.
APPLE);
getActivity().registerReceiver(mIntentReceiver,filter);
Log.i("a", "registerReceiver ");
//end
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if(action.equals(BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT)) {
Log.i("a","intent "+intent);
String command=intent.getStringExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD);
if("+IPHONEACCEV".equals(command)) {
Object[] args = (Object[])intent.getSerializableExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS);
if (args.length >= 3&& args[0] instanceof Integer &&((Integer)args[0])*2+1<=args.length) {
for (inti=0;i<((Integer)args[0]);i++) {
if(!(args[i*2+1] instanceof Integer) || !(args[i*2+2] instanceof Integer)) {
continue;
}
if(args[i*2+1].equals(1)) {
floatlevel=(((Integer)args[i*2+2])+1)/10.0f;//获取的电量百分比
break;
}
}
}
}
}
}
};
② Android应用如何向蓝牙设备发送AT命令
建立socket连接,看协议怎么写的,就怎么发命令。
③ android平台用AT命令发短信
需要COM口连接短信猫,然后根据短信猫中的AT命令来操作。
④ Android 发送AT指令
1、hardware\ril\reference-ril\Reference-ril.c 中 onRequest() 处理RIL_REQUEST_DIAL 时会 调用requestDial();
2、requestDial()中转换RIL_REQUEST_DIAL 请求为AT指令;
3、通过at_send_command()下发;
4、经过at_send_command_full,at_send_command_full_nolock ,writeline()写到设备中。
⑤ android 怎么通过蓝牙向一个硬件发送AT指令
将16进制的字符串转换成bytes,通过hexstring2bytes转换,从而发送指令。
⑥ Android平台的手机,怎么在PC上通过AT指令控制手机收发短信
向日葵远程控制软件支持电脑控制手机、手机控制手机。能实现以上你说的场景,收发短信。控制手机实现后,不仅可以在电脑端或者手机端控制这台手机收发短息,还可以逗穗宴播放视频、山银逛族喊淘宝、下载软件等等
⑦ Android 应用程序怎么通过RIL层发送AT命令
android 电话服务就是通过AT来实现的,不过不是java应用层直接发AT
而是通过socket,把命令发到RIL层,RIL筛选AT命令,与底层交互,实现电悄缓雹话的启帆各个功能
你可以查一查RIL的实哪棚现
⑧ Android平台到底能不能通过串口发送AT指令呢,急!!!
AT命令(Attention)在手机中,用于对modem(也就是移动模块)通过串口命令进行操作,处理与语音电话、短信和数据。
关于AT命令:
Android系统与AT命令
对于智能手机,AP和BP分离的情况,在AP上的系统通过串口和BP通信是个不错方式。在Android的源码中有一个内部包com.android.internal.telephony中有对AT命令的封装和解析,但这种internal的包开发者不能调用的SDK部分,可以用来封装ROM。这说明Android对AT command的方式是支持的。
对于Android如何调用AT command
用root登录命令行,直接对串口进行操作,如echo -e "AT " > /dev/smd0
具体的串口,不同设备会有不同,甚至不一定会提供。这种方式,开发者是可以调用的,通过Runtime.exec直接执行命令行命令,但要求是root,例如echo -e "ATD123456789; " > /dev/smd0,拨打123456789的号码。
目前最新的AT命令标准发布与2014.6.27,似乎还活得挺滋润的。但是给出的keywords是UMTS, GSM, command, terminal, LTE这说明CDMA确实很可能不是采用AT命令的方式。
⑨ android怎么通过蓝牙向一个硬件发送AT指令
将16进制的字符串转换成bytes,通过hexstring2bytes转换而不能直接用getbytes
String string = "41542B50494F392C310D";
mmOutStream.write(string.getBytes());
读取inputsteam中的
?
Log.d("example", "do read");
不执行,完整代码如下:
?
/迟纯**
* This thread runs ring a connection with a remote device. It handles all
* incoming and outgoing transmissions.
*/
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket, String socketType) {
Log.d(TAG, "create ConnectedThread: " + socketType);
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the BluetoothSocket input and output streams
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
byte[] buffer = new byte[1024];
int bytes;
// Keep listening to the InputStream while connected
while (true) {
Log.d("example", "do read");
try {
/如冲/ Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes,
-1, buffer).sendToTarget();
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
/渣旦歼/ Start the service over to restart listening mode
BluetoothChatService.this.start();
break;
}
}
}
/**
* Write to the connected OutStream.
*
* @param buffer
* The bytes to write
*/
public void write(byte[] buffer) {
String string = "41542B50494F392C310D";
try {
mmOutStream.write(string.getBytes());
// Share the sent message back to the UI Activity
mHandler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1,
buffer).sendToTarget();
} catch (IOException e) {
Log.e(TAG, "Exception ring write", e);
}
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "close() of connect socket failed", e);
}
}
}
⑩ Android怎么直接发AT命令测试
一、准备测试环境及测试文件
1、安装Java JDk,设置好环境变量
2、安装Android SDK,设置好环境变量(详细步骤略)
3、准备被测apk及测试所需的一些工具
二、启动模拟器,并解锁
批处理脚本:
emulator -avd Galaxy4.2 ::启动模拟器
ping -n 90 127.0.0.1>nul ::等待模拟器启动成功,-n 90 为等待时间,建议设置大一点
adb shell input keyevent 82 ::模拟器打开后都会锁屏,adb模拟键盘输入,解锁
ping -n 2 127.0.0.1>nul
三、脚本参数初始化
代码如下:
set appName=TestAndroid.apk ::被测程序名称
set pkgName=com.example.testandroid ::被测程序包名
set openName=com.example.testandroid.MainActivity ::被测试程序主activity
set "times=%1" ::测试次数,脚本传入参数
x blat.exe C:\Windows\System32\ /Y ::将邮件工具复制到系统文件夹下,需关闭360卫士
四、循环执行安装打开关闭卸载
echo 测试开始>source.txt ::创建一个source文件记录日志
for /l %%a in (1,1,%times%) do (
adb install TestAndroid.apk ::安装apk
adb shell am start -W -n %pkgName%/%openName% ::打开apk
call cmd /c close.bat %pkgName% ::关闭apk
adb uninstall %pkgName% ::卸载apk
adb logcat -d |findstr "^D/k.*}\>" ::过滤logcat,获取需要的内容
adb logcat -c ::清除logcat日志
taskkill /f /im adb.exe)>>source.txt ::结束adb进程,防止占用source文件
::每次操作日志都记录在source中
五、处理source.txt提取关键信息,并发送邮件
六、设置windows定时任务,参数填写为测试次数,完成。