通过蓝牙从IEC62056协议获取电表数据

时间:2017-10-17 08:28:27

标签: android bluetooth android-bluetooth

我正在开发一个Android应用程序。我需要通过蓝牙光学探针从仪表获取数据。据我所知,我应该连接到蓝牙探测并发送一些请求以获取仪表值。如果有人知道怎么做,请帮助我。我使用了BluetoothSocket,Outputstream和inputstream,但没有运气!

探针是OP-700,我没有任何文档/ SDK

以下代码:

public class Main2Activity extends AppCompatActivity {

private static final int REQUEST_ENABLE_BT = 1;

BluetoothAdapter bluetoothAdapter;

ArrayList<BluetoothDevice> pairedDeviceArrayList;

TextView textInfo, textStatus,Label1;
ListView listViewPairedDevice;
LinearLayout inputPane;
EditText inputField;
Button btnSend;

ArrayAdapter<BluetoothDevice> pairedDeviceAdapter;
private UUID myUUID;
private final String UUID_STRING_WELL_KNOWN_SPP =
        "00001101-0000-1000-8000-00805F9B34FB";

ThreadConnectBTdevice myThreadConnectBTdevice;
ThreadConnected myThreadConnected;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    textInfo = (TextView)findViewById(R.id.info);
    textStatus = (TextView)findViewById(R.id.status);
    listViewPairedDevice = (ListView)findViewById(R.id.pairedlist);

    inputPane = (LinearLayout)findViewById(R.id.inputpane);
    inputField = (EditText)findViewById(R.id.input);
    Label1 = (EditText)findViewById(R.id.Label);
    btnSend = (Button)findViewById(R.id.send);
    btnSend.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            if(myThreadConnected!=null){

                byte[] bytesToSend = inputField.getText().toString().getBytes();
                myThreadConnected.write(bytesToSend);

            }
        }});

    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)){
        Toast.makeText(this,
                "FEATURE_BLUETOOTH NOT support",
                Toast.LENGTH_LONG).show();
        finish();
        return;
    }

    //using the well-known SPP UUID
    myUUID = UUID.fromString(UUID_STRING_WELL_KNOWN_SPP);

    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (bluetoothAdapter == null) {
        Toast.makeText(this,
                "Bluetooth is not supported on this hardware platform",
                Toast.LENGTH_LONG).show();
        finish();
        return;
    }

    String stInfo = bluetoothAdapter.getName() + "\n" +
            bluetoothAdapter.getAddress();
    textInfo.setText(stInfo);
}

@Override
protected void onStart() {
    super.onStart();

    //Turn ON BlueTooth if it is OFF
    if (!bluetoothAdapter.isEnabled()) {
        Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
    }

    setup();
}



private void setup() {
    Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
    if (pairedDevices.size() > 0) {
        pairedDeviceArrayList = new ArrayList<BluetoothDevice>();

        for (BluetoothDevice device : pairedDevices) {
            pairedDeviceArrayList.add(device);
        }

        pairedDeviceAdapter = new ArrayAdapter<BluetoothDevice>(this,
                android.R.layout.simple_list_item_1, pairedDeviceArrayList);
        listViewPairedDevice.setAdapter(pairedDeviceAdapter);

        listViewPairedDevice.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                BluetoothDevice device =
                        (BluetoothDevice) parent.getItemAtPosition(position);
                Toast.makeText(Main2Activity.this,
                        "Name: " + device.getName() + "\n"
                                + "Address: " + device.getAddress() + "\n"
                                + "BondState: " + device.getBondState() + "\n"
                                + "BluetoothClass: " + device.getBluetoothClass() + "\n"
                                + "Class: " + device.getClass(),
                        Toast.LENGTH_LONG).show();

                textStatus.setText("start ThreadConnectBTdevice");
                myThreadConnectBTdevice = new ThreadConnectBTdevice(device);
                myThreadConnectBTdevice.start();
            }
        });
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();

    if(myThreadConnectBTdevice!=null){
        myThreadConnectBTdevice.cancel();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==REQUEST_ENABLE_BT){
        if(resultCode == Activity.RESULT_OK){
            setup();
        }else{
            Toast.makeText(this,
                    "BlueTooth NOT enabled",
                    Toast.LENGTH_SHORT).show();
            finish();
        }
    }
}

//Called in ThreadConnectBTdevice once connect successed
//to start ThreadConnected
private void startThreadConnected(BluetoothSocket socket){

    myThreadConnected = new ThreadConnected(socket);
    myThreadConnected.start();
}

/*
ThreadConnectBTdevice:
Background Thread to handle BlueTooth connecting
*/
private class ThreadConnectBTdevice extends Thread {

    private BluetoothSocket bluetoothSocket = null;
    private final BluetoothDevice bluetoothDevice;


    private ThreadConnectBTdevice(BluetoothDevice device) {
        bluetoothDevice = device;

        try {
            bluetoothSocket = device.createRfcommSocketToServiceRecord(myUUID);
            textStatus.setText("bluetoothSocket: \n" + bluetoothSocket);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        boolean success = false;
        try {
            bluetoothSocket.connect();
            success = true;
        } catch (IOException e) {
            e.printStackTrace();

            final String eMessage = e.getMessage();
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    textStatus.setText("something wrong bluetoothSocket.connect(): \n" + eMessage);
                }
            });

            try {
                bluetoothSocket.close();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }

        if(success){
            //connect successful
            final String msgconnected = "connect successful:\n"
                    + "BluetoothSocket: " + bluetoothSocket + "\n"
                    + "BluetoothDevice: " + bluetoothDevice;

            runOnUiThread(new Runnable(){

                @Override
                public void run() {
                    textStatus.setText(msgconnected);

                    listViewPairedDevice.setVisibility(View.GONE);
                    inputPane.setVisibility(View.VISIBLE);
                }});

            startThreadConnected(bluetoothSocket);
        }else{
            //fail
        }
    }

    public void cancel() {

        Toast.makeText(getApplicationContext(),
                "close bluetoothSocket",
                Toast.LENGTH_LONG).show();

        try {
            bluetoothSocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

/*
ThreadConnected:
Background Thread to handle Bluetooth data communication
after connected
 */
private class ThreadConnected extends Thread {
    private final BluetoothSocket connectedBluetoothSocket;
    private final InputStream connectedInputStream;
    private final OutputStream connectedOutputStream;

    public ThreadConnected(BluetoothSocket socket) {
        connectedBluetoothSocket = socket;
        InputStream in = null;
        OutputStream out = null;

        try {
            in = socket.getInputStream();
            out = socket.getOutputStream();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        connectedInputStream = in;
        connectedOutputStream = out;
    }

    @Override
    public void run() {
        byte[] buffer = new byte[1024];
        int bytes;

        while (true) {
            try {
                bytes = connectedInputStream.read(buffer);
                String strReceived = new String(buffer, 0, bytes);
                final String msgReceived = String.valueOf(bytes) +
                        " bytes received:\n"
                        + strReceived;

                runOnUiThread(new Runnable(){

                    @Override
                    public void run() {
                        textStatus.setText(msgReceived);
                    }});

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

                final String msgConnectionLost = "Connection lost:\n"
                        + e.getMessage();
                runOnUiThread(new Runnable(){

                    @Override
                    public void run() {
                        textStatus.setText(msgConnectionLost);
                    }});
            }
        }
    }

    public void write(byte[] buffer) {
        try {
            connectedOutputStream.write(buffer);
        } catch (IOException e) {
            textStatus.setText(e.getMessage());
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void cancel() {
        try {
            connectedBluetoothSocket.close();
        } catch (IOException e) {
            textStatus.setText(e.getMessage());
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

根据您的制造商(this is the web of the product)明确说明:

  

请注意,在耗量表和外围设备之间交换数据时需要使用其他特定软件。

在操作系统中,它只提到了Windows OS桌面版。

抱歉,关于该探测的信息不多。这里,用于读取电表(IEC-62056-21)的协议无关紧要。相关部分是您如何与探针通信,而不是探针用于读数的标准。关于您的应用,相关标准是&#34;通过蓝牙进行串口通信&#34;

与您的提供商或您的德国制造商联系。