㈠ 什麼是安卓協議
安卓協議是 手機端和手機操作系統之間的一個運行,交換數據,對等的一個計算機內部程序稱作「協議」這個協議程序是系統和機器之間的一個重要對介面憑證和工式。其實就是安卓系統允許什麼樣的手機,什麼樣的程序,以什麼要求來運行這個程序的一個限定。
㈡ 安卓wifi開發,要使用modbus協議,請問該怎麼使用
"你好 想問你一個問題~如果我用wifi使用socket發送讀寫寄存器命令,wifi端用rtu能實現嗎?還是必須用modbus/tcp?"
可以. MODBUS其實可以從硬體層與軟體層來看 . 硬體層就是通訊的媒介, 一般就是CAT網線或者是RS485這兩種居多.
軟體層面則分為三個類別, 1: MODBUS TCP(可簡單理解為加了一個封包頭的MODBUS命令)
2. MODBUS RTU (簡單理解為具有CRC校驗機制的MODBUS令令) 3. MODBUS ASCII (與RTU相同, 只是命令改為ASCII明碼)
再回來看您的問題, WiFi是基於SCOKET也就是TCP方式通訊. 這只是一條道路, 只要MODBUS主機與MODBUS從機事先說好了, 兩者都用RTU(具有CRC校驗的方式)做通訊, 就可以正常的通訊.
這種方式, 一般俗稱為 "RTU OVER TCP" 的MODBUS協定. 即把RTU的格式直接透過SOCKET發送或接收, 就不像MODBUS TCP帶前特定的包頭了.
另外, 也有人利用UDP來傳遞MODBUS命令的. 也是OK的. 總之, 硬體層與軟體層只要主從機間一致了. 都能通訊上的. 唯一的差別是與其它MODBUS設備的兼容度問題了. 最通用也就是兼容性最高的, 就是 "MODBUS TCP" 與 "MODBUS RTU" 這兩種了.
㈢ android bluetooth hid協議的開發求助
Android Bluetooth HID實現詳解
Android 關於藍牙的部分使用的是BlueZ協議棧。但是直到目前2.3.3都沒有擴展HID的profile,只是實現了最基本的Handset和d2dp的profile,所以我們的工作涉及到從應用到jni三層的修改,具體修改文件如圖所示,綠色表示新建的類,橙色表示修改的類。
一. 本地層
路徑:framework/base/core/jni/
參照android_server_BluetoothA2dpService.cpp新建android_server_bluetoothHidServer.cpp。該類中主要是通過dbus對bluez協議棧的訪問,dbus 的通用方法都在android_bluetooth_common.cpp中實現,我們做的僅僅是通過dbus_func_args_async調用到bluez提供的input介面。
主要實現以下兩個方法函數:
static jboolean connectSinkNative(JNIEnv *env, jobject object, jstring path) {
#ifdef HAVE_BLUETOOTH
LOGV(__FUNCTION__);
if (nat) {
const char *c_path = env->GetStringUTFChars(path, NULL);
bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,
c_path, "org.bluez.Input", "Connect",
DBUS_TYPE_INVALID);
env->ReleaseStringUTFChars(path, c_path);
return ret ? JNI_TRUE : JNI_FALSE;
}
#endif
return JNI_FALSE;
}
static jboolean disconnectSinkNative(JNIEnv *env, jobject object,
jstring path) {
#ifdef HAVE_BLUETOOTH
LOGV(__FUNCTION__);
if (nat) {
const char *c_path = env->GetStringUTFChars(path, NULL);
bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,
c_path, "org.bluez.Input", "Disconnect",
DBUS_TYPE_INVALID);
env->ReleaseStringUTFChars(path, c_path);
return ret ? JNI_TRUE : JNI_FALSE;
}
#endif
return JNI_FALSE;
}
這里要注意將該文件添加到AndroidRuntime.cpp和Android.mk中,否則不會編譯到動態庫中。
此部分編譯後最終生成libandroid_runtime.so並替換到system/libs下
二.Framework的java部分
路徑framework/base/java/android/server/中添加BluetoothHidService.java文件
路徑framework/base/java/android/bluetooth/中添加BluetoothHid.java和IBluetoothHid.aidl文件。
interface IBluetoothHid {
boolean connect(in BluetoothDevice device);
boolean disconnect(in BluetoothDevice device);
int getState(in BluetoothDevice device);
boolean setPriority(in BluetoothDevice device, int priority);
int getPriority(in BluetoothDevice device);
}
BluetoothHid.java中主要的兩個方法connect和disconnect間接地通過aidl訪問BluetoothHidService。這里主要是實現跨進程並為上層提供可直接訪問的方法。
由此framework的主要部分打包生成framework.Jar並最終部署到system/framework里。
三.應用(Settings.apk)
最後需要修改應用部分,應用部分的修改點比較分散,不想框架層那樣整塊模仿A2DP的樣子那麼方便,但也不是說jni部分有多麼容易。反而對於我這種對C語言不熟悉的人來說,修改jni是最頭疼得事了。好在藍牙HID這部分框架層的修改都是整塊進行的,理解上還算比價容易。
總的來說在Settings.apk中要修改的文件主要是這么幾個:
LocalBluetoothProfileManager.java這里主要提供一個HID的profile以便應用層訪問。建一個HIDProfile的class調用framework中的BluetoothHID。實際上就是通過bender機制調用了BluetoothHidService。
CashedBluetoothDevice中添加顯示藍牙鍵盤的圖標,BluetoothPairingDialog中則需要添加一段藍牙配對驗證處理的代碼,我是參照i9000中先彈出一個隨機數,然後在鍵盤中敲入相同的隨機數即配對成功,具體實現如下:
// HID
if (isDeviceKeyboard(mDevice)) {
String pin = String.format("%06d", Long.valueOf(Math
.abs(new Random().nextLong() % 1000000L)));
mPairingView.setVisibility(View.GONE);
messageView.setText(getString(
R.string.bluetooth_enter_keyboard_pin_msg, pin, name));
byte[] bytePin = BluetoothDevice.convertPinToBytes(pin);
if (bytePin != null) {
mDevice.setPin(bytePin);
}
}
……
}
轉載