- 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/
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!