㈠ 什么是安卓协议
安卓协议是 手机端和手机操作系统之间的一个运行,交换数据,对等的一个计算机内部程序称作“协议”这个协议程序是系统和机器之间的一个重要对接口凭证和工式。其实就是安卓系统允许什么样的手机,什么样的程序,以什么要求来运行这个程序的一个限定。
㈡ 安卓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);
}
}
……
}
转载