- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试从欧姆龙 708-BT 血压监测仪读取数据,该监测仪已通过 continua 健康联盟认证。我正在关注这个例子 of a Bluetooth HDP App .我设法连接到设备并以字节格式检索数据,但无法解析数据以获取所需的值。我试图遵循此 PDF 第 19 页指定的 IEEE 血压规范.
这是添加到上面链接的示例代码中的代码。
//Variables in the class
private int count;
private byte[] invoke = {0x00, 0x00};
private class ReadThread extends Thread {
private ParcelFileDescriptor mFd;
public ReadThread(ParcelFileDescriptor fd) {
super();
mFd = fd;
}
@Override
public void run() {
FileInputStream fis = new FileInputStream(mFd.getFileDescriptor());
final byte data[] = new byte[300];
try {
while(fis.read(data) > -1) {
// At this point, the application can pass the raw data to a parser that
// has implemented the IEEE 11073-xxxxx specifications. Instead, this sample
// simply indicates that some data has been received
Log.e("Test", data.toString());
if (data[0] != (byte) 0x00)
{
String test = byte2hex(data);
Log.i(TAG, test);
if(data[0] == (byte) 0xE2){
Log.i(TAG, "E2");
count = 1;
(new WriteThread(mFd)).start();
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i(TAG, "Seconds Write Thread");
count = 2;
(new WriteThread(mFd)).start();
}
else if (data[0] == (byte)0xE7){
Log.i(TAG, "E7");
count = 3;
//set invoke id so get correct response
invoke = new byte[] { data[6], data[7] };
(new WriteThread(mFd)).start();
//parse data!!
int number_of_data_packets = data[25];
int packet_start = 30;
final int SYS_DIA_MAP_DATA = 1;
final int PULSE_DATA = 2;
final int ERROR_CODE_DATA = 3;
for (int i = 0; i < number_of_data_packets; i++){
Log.e("TEST", Integer.toString(i));
int obj_handle = data[packet_start+1];
switch (obj_handle)
{
case SYS_DIA_MAP_DATA:
int sys = byteToUnsignedInt(data[packet_start+9]);
int dia = byteToUnsignedInt(data[packet_start+11]);
int map = byteToUnsignedInt(data[packet_start+13]);
//create team string... 9+13~9+20
Log.e("RESULT", "sys is "+ sys);
sendMessage(RECEIVED_SYS, sys);
Log.e("RESULT", "dia is "+ dia);
sendMessage(RECEIVED_DIA, dia);
Log.e("RESULT", "map is "+ map);
break;
case PULSE_DATA:
//parse
int pulse = byteToUnsignedInt(data[packet_start+5]);
Log.e("RESULT", "pulse is " + pulse);
sendMessage(RECEIVED_PUL, pulse);
break;
case ERROR_CODE_DATA:
//need more signal
break;
}
packet_start += 1;//4 + data[packet_start+3]; //4 = ignore beginning four bytes
}
}
else if (data[0] == (byte) 0xE4)
{
count = 4;
(new WriteThread(mFd)).start();
}
//zero out the data
for (int i = 0; i < data.length; i++){
data[i] = (byte) 0x00;
}
}
sendMessage(STATUS_READ_DATA, 0);
}
} catch(IOException ioe) {}
if (mFd != null) {
try {
mFd.close();
} catch (IOException e) { /* Do nothing. */ }
}
sendMessage(STATUS_READ_DATA_DONE, 0);
}
}
private class WriteThread extends Thread {
private ParcelFileDescriptor mFd;
public WriteThread(ParcelFileDescriptor fd) {
super();
mFd = fd;
}
@Override
public void run() {
FileOutputStream fos = new FileOutputStream(mFd.getFileDescriptor());
final byte data_AR[] = new byte[] { (byte) 0xE3, (byte) 0x00,
(byte) 0x00, (byte) 0x2C,
(byte) 0x00, (byte) 0x00,
(byte) 0x50, (byte) 0x79,
(byte) 0x00, (byte) 0x26,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x80, (byte) 0x00,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x08, //bt add for phone, can be automate in the future
(byte) 0x3C, (byte) 0x5A, (byte) 0x37, (byte) 0xFF,
(byte) 0xFE, (byte) 0x95, (byte) 0xEE, (byte) 0xE3,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
final byte data_DR[] = new byte[] { (byte) 0xE7, (byte) 0x00,
(byte) 0x00, (byte) 0x12,
(byte) 0x00, (byte) 0x10,
(byte) invoke[0], (byte) invoke[1],
(byte) 0x02, (byte) 0x01,
(byte) 0x00, (byte) 0x0A,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x0D, (byte) 0x1D,
(byte) 0x00, (byte) 0x00 };
final byte get_MDS[] = new byte[] { (byte) 0xE7, (byte) 0x00,
(byte) 0x00, (byte) 0x0E,
(byte) 0x00, (byte) 0x0C,
(byte) 0x00, (byte) 0x24,
(byte) 0x01, (byte) 0x03,
(byte) 0x00, (byte) 0x06,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00 };
final byte data_RR[] = new byte[] { (byte) 0xE5, (byte) 0x00,
(byte) 0x00, (byte) 0x02,
(byte) 0x00, (byte) 0x00 };
final byte data_RRQ[] = new byte[] { (byte) 0xE4, (byte) 0x00,
(byte) 0x00, (byte) 0x02,
(byte) 0x00, (byte) 0x00 };
final byte data_ABORT[] = new byte[] { (byte) 0xE6, (byte) 0x00,
(byte) 0x00, (byte) 0x02,
(byte) 0x00, (byte) 0x00 };
try {
Log.i(TAG, String.valueOf(count));
if (count == 1)
{
fos.write(data_AR);
Log.i(TAG, "Association Responded!");
}
else if (count == 2)
{
fos.write(get_MDS);
Log.i(TAG, "Get MDS object attributes!");
}
else if (count == 3)
{
fos.write(data_DR);
Log.i(TAG, "Data Responsed!");
}
else if (count == 4)
{
fos.write(data_RR);
Log.i(TAG, "Data Released!");
}
} catch(IOException ioe) {}
}
数据的十六进制表示如下。我相信这些数据包含血压值的值,但可能是错误的。我相信这是唯一的原因是因为在上面链接的 PDF 中,数据将以十六进制值 e7 开头。
03-23 20:14:44.186: I/BluetoothHDPService(23652):e70000da00d80024020300d20000000a00cc0928002000104f4d524f4e204845414c544843415245000c48454d2d373038312d4954000984000a0008002209225835c3280a5a000800010004100700010a4400024000092d00360002003200010001001653455249414c5f4e554d4245523a200000000000004100050001001046575f5245564953494f4e3a203130310914000400005dc00a4b0016000200120201000801000001000200070202000200000a450010c0101f00ffffffff00640000000000000a550008000100040a620006098700082010010100013600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
最佳答案
我设法解决了这个问题。我遇到的主要问题是我只读了一个血压读数然后一直按上传。这确实会上传一些关于显示器的信息,但不包括血压读数。知道这一点后,我还有许多其他较小的错误需要解决,但没有什么太复杂的。最终工作服务的代码如下。
public class BluetoothHDPService extends Service {
private static final String TAG = "BluetoothHDPService";
public static final int RESULT_OK = 0;
public static final int RESULT_FAIL = -1;
// Status codes sent back to the UI client.
// Application registration complete.
public static final int STATUS_HEALTH_APP_REG = 100;
// Application unregistration complete.
public static final int STATUS_HEALTH_APP_UNREG = 101;
// Channel creation complete.
public static final int STATUS_CREATE_CHANNEL = 102;
// Channel destroy complete.
public static final int STATUS_DESTROY_CHANNEL = 103;
// Reading data from Bluetooth HDP device.
public static final int STATUS_READ_DATA = 104;
// Done with reading data.
public static final int STATUS_READ_DATA_DONE = 105;
// Message codes received from the UI client.
// Register client with this service.
public static final int MSG_REG_CLIENT = 200;
// Unregister client from this service.
public static final int MSG_UNREG_CLIENT = 201;
// Register health application.
public static final int MSG_REG_HEALTH_APP = 300;
// Unregister health application.
public static final int MSG_UNREG_HEALTH_APP = 301;
// Connect channel.
public static final int MSG_CONNECT_CHANNEL = 400;
// Disconnect channel.
public static final int MSG_DISCONNECT_CHANNEL = 401;
public static final int RECEIVED_SYS = 901;
public static final int RECEIVED_DIA = 902;
public static final int RECEIVED_PUL = 903;
private int count;
private byte[] invoke = {0x00, 0x00};
private BluetoothHealthAppConfiguration mHealthAppConfig;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothHealth mBluetoothHealth;
private BluetoothDevice mDevice;
private int mChannelId;
private Messenger mClient;
// Handles events sent by {@link HealthHDPActivity}.
@SuppressLint("HandlerLeak")
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// Register UI client to this service so the client can receive messages.
case MSG_REG_CLIENT:
Log.d(TAG, "Activity client registered");
mClient = msg.replyTo;
break;
// Unregister UI client from this service.
case MSG_UNREG_CLIENT:
mClient = null;
break;
// Register health application.
case MSG_REG_HEALTH_APP:
registerApp(msg.arg1);
break;
// Unregister health application.
case MSG_UNREG_HEALTH_APP:
unregisterApp();
break;
// Connect channel.
case MSG_CONNECT_CHANNEL:
mDevice = (BluetoothDevice) msg.obj;
connectChannel();
break;
// Disconnect channel.
case MSG_DISCONNECT_CHANNEL:
mDevice = (BluetoothDevice) msg.obj;
disconnectChannel();
break;
default:
super.handleMessage(msg);
}
}
}
final Messenger mMessenger = new Messenger(new IncomingHandler());
/**
* Make sure Bluetooth and health profile are available on the Android device. Stop service
* if they are not available.
*/
@SuppressLint("ShowToast")
@Override
public void onCreate() {
super.onCreate();
Log.e("TEST", "HDPService Created");
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
// Bluetooth adapter isn't available. The client of the service is supposed to
// verify that it is available and activate before invoking this service.
stopSelf();
return;
}
if (!mBluetoothAdapter.getProfileProxy(this, mBluetoothServiceListener,
BluetoothProfile.HEALTH)) {
Toast.makeText(this, "bluetooth_health_profile_not_available",
Toast.LENGTH_LONG);
stopSelf();
return;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "BluetoothHDPService is running.");
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
};
// Register health application through the Bluetooth Health API.
private void registerApp(int dataType) {
Log.e(TAG, "registerApp()");
mBluetoothHealth.registerSinkAppConfiguration(TAG, dataType, mHealthCallback);
}
// Unregister health application through the Bluetooth Health API.
private void unregisterApp() {
Log.e(TAG, "unregisterApp()");
mBluetoothHealth.unregisterAppConfiguration(mHealthAppConfig);
}
// Connect channel through the Bluetooth Health API.
private void connectChannel() {
Log.i(TAG, "connectChannel()");
mBluetoothHealth.connectChannelToSource(mDevice, mHealthAppConfig);
}
// Disconnect channel through the Bluetooth Health API.
private void disconnectChannel() {
Log.i(TAG, "disconnectChannel()");
mBluetoothHealth.disconnectChannel(mDevice, mHealthAppConfig, mChannelId);
}
// Callbacks to handle connection set up and disconnection clean up.
private final BluetoothProfile.ServiceListener mBluetoothServiceListener =
new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEALTH) {
mBluetoothHealth = (BluetoothHealth) proxy;
if (Log.isLoggable(TAG, Log.DEBUG))
Log.d(TAG, "onServiceConnected to profile: " + profile);
}
}
public void onServiceDisconnected(int profile) {
if (profile == BluetoothProfile.HEALTH) {
mBluetoothHealth = null;
}
}
};
private final BluetoothHealthCallback mHealthCallback = new BluetoothHealthCallback() {
// Callback to handle application registration and unregistration events. The service
// passes the status back to the UI client.
public void onHealthAppConfigurationStatusChange(BluetoothHealthAppConfiguration config,
int status) {
if (status == BluetoothHealth.APP_CONFIG_REGISTRATION_FAILURE) {
mHealthAppConfig = null;
sendMessage(STATUS_HEALTH_APP_REG, RESULT_FAIL);
} else if (status == BluetoothHealth.APP_CONFIG_REGISTRATION_SUCCESS) {
mHealthAppConfig = config;
sendMessage(STATUS_HEALTH_APP_REG, RESULT_OK);
} else if (status == BluetoothHealth.APP_CONFIG_UNREGISTRATION_FAILURE ||
status == BluetoothHealth.APP_CONFIG_UNREGISTRATION_SUCCESS) {
sendMessage(STATUS_HEALTH_APP_UNREG,
status == BluetoothHealth.APP_CONFIG_UNREGISTRATION_SUCCESS ?
RESULT_OK : RESULT_FAIL);
}
}
// Callback to handle channel connection state changes.
// Note that the logic of the state machine may need to be modified based on the HDP device.
// When the HDP device is connected, the received file descriptor is passed to the
// ReadThread to read the content.
public void onHealthChannelStateChange(BluetoothHealthAppConfiguration config,
BluetoothDevice device, int prevState, int newState, ParcelFileDescriptor fd,
int channelId) {
Log.e("Read Thread", "Start If Statements");
Log.e("Read Thread", "prevState: " + prevState);
Log.e("Read Thread", "newState: " + newState);
if (Log.isLoggable(TAG, Log.DEBUG))
Log.d(TAG, String.format("prevState\t%d ----------> newState\t%d",
prevState, newState));
// if (prevState != BluetoothHealth.STATE_CHANNEL_CONNECTED &&
// newState == BluetoothHealth.STATE_CHANNEL_CONNECTED) {
if (prevState == BluetoothHealth.STATE_CHANNEL_DISCONNECTED &&
newState == BluetoothHealth.STATE_CHANNEL_CONNECTED) {
if (config.equals(mHealthAppConfig)) {
mChannelId = channelId;
sendMessage(STATUS_CREATE_CHANNEL, RESULT_OK);
Log.e("Read Thread", "Read Start 1");
(new ReadThread(fd)).start();
} else {
Log.e("Read Thread", "Status Create Channel Fail 1");
sendMessage(STATUS_CREATE_CHANNEL, RESULT_FAIL);
}
} else if (prevState == BluetoothHealth.STATE_CHANNEL_CONNECTING &&
newState == BluetoothHealth.STATE_CHANNEL_DISCONNECTED) {
sendMessage(STATUS_CREATE_CHANNEL, RESULT_FAIL);
Log.e("Read Thread", "Status Create Channel Fail 2");
} else if (newState == BluetoothHealth.STATE_CHANNEL_DISCONNECTED) {
if (config.equals(mHealthAppConfig)) {
sendMessage(STATUS_DESTROY_CHANNEL, RESULT_OK);
Log.e("Read Thread", "Status Disconnect OK");
} else {
sendMessage(STATUS_DESTROY_CHANNEL, RESULT_FAIL);
Log.e("Read Thread", "Status Disconnect FAIL");
}
}else if (prevState == BluetoothHealth.STATE_CHANNEL_CONNECTING && newState == BluetoothHealth.STATE_CHANNEL_CONNECTED) {
if (config.equals(mHealthAppConfig)) {
mChannelId = channelId;
sendMessage(STATUS_CREATE_CHANNEL, RESULT_OK);
Log.e("Read Thread", "Read Start 2");
(new ReadThread(fd)).start();
} else {
sendMessage(STATUS_CREATE_CHANNEL, RESULT_FAIL);
Log.e("Read Thread", "Status Create Channel Fail 3");
}
}
}
};
// Sends an update message to registered UI client.
private void sendMessage(int what, int value) {
if (mClient == null) {
Log.d(TAG, "No clients registered.");
return;
}
try {
mClient.send(Message.obtain(null, what, value, 0));
} catch (RemoteException e) {
// Unable to reach client.
e.printStackTrace();
}
}
public String byte2hex(byte[] b){
// String Buffer can be used instead
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++){
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1){
hs = hs + "0" + stmp;
}
else{
hs = hs + stmp;
}
if (n < b.length - 1){
hs = hs + "";
}
}
return hs;
}
public static int byteToUnsignedInt(byte b) {
return 0x00 << 24 | b & 0xff;
}
public static int toInt(byte[] bytes) {
int ret = 0;
for (int i=0; i<4 && i<bytes.length; i++) {
ret <<= 8;
ret |= (int)bytes[i] & 0xFF;
}
return ret;
}
// Thread to read incoming data received from the HDP device. This sample application merely
// reads the raw byte from the incoming file descriptor. The data should be interpreted using
// a health manager which implements the IEEE 11073-xxxxx specifications.
private class ReadThread extends Thread {
private ParcelFileDescriptor mFd;
public ReadThread(ParcelFileDescriptor fd) {
super();
mFd = fd;
}
@Override
public void run() {
Log.e("TEST", "Read Data 1");
FileInputStream fis = new FileInputStream(mFd.getFileDescriptor());
final byte data[] = new byte[200];
Log.i(TAG, "Read Data 2");
try {
while(fis.read(data) > -1) {
// At this point, the application can pass the raw data to a parser that
// has implemented the IEEE 11073-xxxxx specifications. Instead, this sample
// simply indicates that some data has been received.
Log.i(TAG, "INBOUND");
String test = byte2hex(data);
Log.i(TAG, test);
if (data[0] != (byte) 0x00)
{
if(data[0] == (byte) 0xE2){
Log.i(TAG, "E2 - Association Request");
count = 1;
(new WriteThread(mFd)).start();
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count = 2;
(new WriteThread(mFd)).start();
}
else if (data[0] == (byte)0xE7){
Log.i(TAG, "E7 - Data Given");
if(data[3] != (byte)0xda){
invoke[0] = data[6];
invoke[1] = data[7];
Log.i(TAG, "E7 - Reading?");
ByteBuffer sys = ByteBuffer.allocate(2);
sys.order(ByteOrder.LITTLE_ENDIAN);
sys.put(data[45]);
sys.put(data[46]);
short sysVal = sys.getShort(0);
Log.i(TAG, " Sys - "+sysVal);
ByteBuffer dia = ByteBuffer.allocate(2);
dia.order(ByteOrder.LITTLE_ENDIAN);
dia.put(data[47]);
dia.put(data[48]);
short diaVal = dia.getShort(0);
Log.i(TAG, " Dia - "+diaVal);
sendMessage(9919, diaVal);
sendMessage(9920, sysVal);
for(int i=0; i<(data.length-2); i++){
ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(data[i]);
bb.put(data[i+1]);
short shortVal = bb.getShort(0);
Log.i(TAG, i+" Short Val - "+shortVal);
}
count = 3;
//set invoke id so get correct response
(new WriteThread(mFd)).start();
}
//parse data!!
}
else if (data[0] == (byte) 0xE4)
{
//count = 4;
// (new WriteThread(mFd)).start();
}
//zero out the data
for (int i = 0; i < data.length; i++){
data[i] = (byte) 0x00;
}
}
sendMessage(STATUS_READ_DATA, 0);
}
} catch(IOException ioe) {}
if (mFd != null) {
try {
mFd.close();
} catch (IOException e) { /* Do nothing. */ }
}
sendMessage(STATUS_READ_DATA_DONE, 0);
}
}
private class WriteThread extends Thread {
private ParcelFileDescriptor mFd;
public WriteThread(ParcelFileDescriptor fd) {
super();
mFd = fd;
}
@Override
public void run() {
FileOutputStream fos = new FileOutputStream(mFd.getFileDescriptor());
final byte data_AR[] = new byte[] { (byte) 0xE3, (byte) 0x00,
(byte) 0x00, (byte) 0x2C,
(byte) 0x00, (byte) 0x00,
(byte) 0x50, (byte) 0x79,
(byte) 0x00, (byte) 0x26,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x80, (byte) 0x00,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x08, //bt add for phone, can be automate in the future
(byte) 0x3C, (byte) 0x5A, (byte) 0x37, (byte) 0xFF,
(byte) 0xFE, (byte) 0x95, (byte) 0xEE, (byte) 0xE3,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
final byte data_DR[] = new byte[] { (byte) 0xE7, (byte) 0x00,
(byte) 0x00, (byte) 0x12,
(byte) 0x00, (byte) 0x10,
(byte) 0x00, (byte) 0x24,
(byte) 0x02, (byte) 0x01,
(byte) 0x00, (byte) 0x0A,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x0D, (byte) 0x1D,
(byte) 0x00, (byte) 0x00 };
final byte get_MDS[] = new byte[] { (byte) 0xE7, (byte) 0x00,
(byte) 0x00, (byte) 0x0E,
(byte) 0x00, (byte) 0x0C,
(byte) 0x00, (byte) 0x24,
(byte) 0x01, (byte) 0x03,
(byte) 0x00, (byte) 0x06,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00 };
final byte data_RR[] = new byte[] { (byte) 0xE5, (byte) 0x00,
(byte) 0x00, (byte) 0x02,
(byte) 0x00, (byte) 0x00 };
// final byte data_RRQ[] = new byte[] { (byte) 0xE4, (byte) 0x00,
// (byte) 0x00, (byte) 0x02,
// (byte) 0x00, (byte) 0x00 };
//
// final byte data_ABORT[] = new byte[] { (byte) 0xE6, (byte) 0x00,
// (byte) 0x00, (byte) 0x02,
// (byte) 0x00, (byte) 0x00 };
try {
Log.i(TAG, String.valueOf(count));
if (count == 1)
{
fos.write(data_AR);
Log.i(TAG, "Association Responded!");
}
else if (count == 2)
{
fos.write(get_MDS);
Log.i(TAG, "Get MDS object attributes!");
}
else if (count == 3)
{
fos.write(data_DR);
Log.i(TAG, "Data Responsed!");
}
else if (count == 4)
{
fos.write(data_RR);
Log.i(TAG, "Data Released!");
}
} catch(IOException ioe) {}
}
}
}
关于java - 解析从蓝牙 HDP 设备接收到的原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15591637/
iphone设备UDID、iphone设备ID和iphone设备Token之间有什么区别? 通常,当我们使用苹果推送通知服务时,会使用 iPhone 设备 token 。 但我的目标只是识别唯一的 i
我们使用 firebase 从服务器向 Android 和 IOS 设备发送通知,并且我们使用旧版 FCM 发送通知。但是当我们的应用程序在后台时,通知由系统本身处理,因此我们无法通过应用程序处理它。
在 Google 上搜索后,我发现人们说只能通过“MFi 程序”将 iOS 设备与非 iOS 设备连接起来。这是真的吗? 我的项目主要集中于直接通过蓝牙与Arduino设备发送和接收信息。 iOS和非
所以我有一个通用应用程序,我正在设置 UIScrollView 的内容大小。显然,iPhone 和 iPad 上的内容大小会有所不同。如何为 iPad 设置某种尺寸,为 iPhone 和 iPod t
问题:如何在 pod 中使用连接到主机的原始设备作为 block 设备。 我尝试使用类型为“BlockDevice”的“hostPath” volumes: - my-data: hostPath
Implemented GCKDeviceScannerListener Singleton Class on ViewController, however its delegate methods
我有一个 (PhoneGap) 应用程序,它将成功获得 Passbook 通行证,并且还将成功接收与 Passbook 分开的推送通知(当伪造设备 ID 时)。 我遇到的问题是发送给注册设备的设备 I
我正在尝试找到一种方法,通过我目前正在使用的 iOS 应用程序访问我的信标的电池电量。我正在使用 Kontakt 的 iBeacon 设备。我浏览了 Estimote iOS SDK,他们提供了一种实
我正在努力让 CUDA 应用程序也能监控 GPU 的核心温度。可通过 NVAPI 访问该信息。 问题是我想确保在运行代码时监控的是同一个 GPU。 但是,似乎有信息表明我从 NvAPI_EnumPhy
从沙箱模式到生产模式,设备 token 有何不同? 我认为我已将一些设备 token 锁定为生产模式,并且无法将它们从开发中插入。 关于如何检查有什么想法吗? 最佳答案 当您使用开发证书构建应用程序时
目录 /run/user/1000/gvfs 和 ~/.gvfs 分别是空的和不存在的。我的图形文件管理器 (Thunar) 能够检测和访问设备的内部和外部存储器。 命令 gvfs-mount -l
我有一个 Android 平板电脑,它有一个迷你 USB 端口和一个 USB 端口,我想编写一个与 USB key 通信的应用程序。我写了一个demo来找出U盘,但是没有任何反应。 令我不安的是,如果
我们将 PHP 版本从 5.4.25 更改为 5.4.45,并在服务器上安装了 MS SQL 驱动程序。在更改服务器之前,一切正常,但在更改服务器之后,我遇到了 Web 服务问题。我们的身份验证 So
我想知道是否有人使用此 API 在 Android 设备上同时从 2 个后置摄像头捕获图像或视频:https://source.android.com/docs/core/camera/concurr
我正在为客户构建一个物联网解决方案,网络管理员坚持要求设备仅通过访客网络进行连接,该网络有一个强制门户,其中的服务条款必须通过按下 UI 按钮来接受,然后才能获得外部互联网访问。到目前为止,我见过的大
我无法弄清楚这里的格式规则..在我的示例中,代码行太多,无法为每行添加 4 个空格,因此这里是我需要帮助的代码的链接 http://nitemsg.blogspot.com/2011/01/heres
如果我在我的设备上接受推送通知,并且不保存设备 token ,那么我如何在自定义 View 中查看设备 token 或恢复警报 View ? 我删除了应用程序并重新安装,但看不到设备 token 警报
我试图找出在尝试并行比较和复制设备 block 与 pthreads 时我做错了什么。看起来我正在脱离同步并且比较阶段无法正常工作。任何帮助将不胜感激 #ifndef __dbg_h__ #defin
我刚刚写完所有这些内容,但这个红色的小栏告诉我我不能发布图片或两个以上的链接。因此,如果您可以引用 this Imgur album , 那简直太好了。谢谢。 我在这里相对较新,甚至对 android
我需要启用 mysql 常规日志并将其通过 nsf 移动到我系统中的另一个驱动器/设备! 所以,我在 my.cnf 中启用了它: general_log = 1 general_log_fi
我是一名优秀的程序员,十分优秀!