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定時任務,參數填寫為測試次數,完成。