手机APP开发 2017-03-16
前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信。
我是通过XCOM v2.0 发送信息,移动端接收信息后也可以发信息过去,界面如下(比较简单自己写就行)
与硬件通信肯定免不了解析Json,使用Gson解析简单方便,在解析过程中遇到了一个坑爹的问题,解析出错了(;′⌒`),我在电脑输入下面字符串
{\"name\":\"John\", \"age\":20,\"grade\":{\"course\":\"English\",\"score\":100,\"level\":\"A\"}}
\"是代表 "这个符号,所以我就从XCOM v2.0发送上面字符串过来,解析失败。。。后来debug发现发送过来的信息是直接当字符串处理,不会再转义,也就\"是代表\",
所以只需发送下面格式信息即可解析
{"name":"John", "age":20,"grade":{"course":"English","score":100,"level":"A"}} 接下来是是代码,代码比较容易,连接局域网(WIFI或者热点都行) 这里的代码是基于知道硬件ip和port上的,当然你也可以通过UDP广播去获取ip和port。 Socket连接也属于网络连接,必须放在子线程中。 注意在清单文件配置网络和WIFI权限
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEditText = (EditText) findViewById(R.id.edittext); connectButton = (Button) findViewById(R.id.connectbutton); sendButton = (Button) findViewById(R.id.sendbutton); mTextView = (TextView) findViewById(R.id.retextview); //连接按钮 connectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new Thread() { @Override public void run() { super.run(); try { clientSocket = new Socket("192.168.23.6", 3000); mReceiveThread = new ReceiveThread(clientSocket); mReceiveThread.start(); }catch (IOException e) { e.printStackTrace(); } } }.start(); displayToast("连接成功"); stop = false; } }); //发送数据 sendButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { byte[] msgBuffer = null; String text = mEditText.getText().toString(); try { msgBuffer = text.getBytes("GB2312"); outStrean = clientSocket.getOutputStream(); outStrean.write(msgBuffer); } catch (IOException e) { e.printStackTrace(); } mTextView.setText(text); displayToast("发送成功"); } }); } private void displayToast(String s) { Toast.makeText(this, s, Toast.LENGTH_SHORT).show(); } private class ReceiveThread extends Thread { private InputStream inStrean = null; private byte[] buf11 = new byte[1024]; private String str11 = null; public ReceiveThread(Socket s) { try { this.inStrean = s.getInputStream(); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { super.run(); while (!stop) { try { this.inStrean.read(buf11); str11 = new String(buf11,"GB2312"); Gson gson = new Gson(); JsonReader reader = new JsonReader(new StringReader(str11)); reader.setLenient(true); Student student = gson.fromJson(reader,Student.class); String name = student.getName(); // System.out.println(student.toString()); Message msg = new Message(); msg.obj = name; mHandle.sendMessage(msg); } catch (IOException e) { e.printStackTrace(); } } } } @Override public void onDestroy() { super.onDestroy(); if (mReceiveThread != null) { try { clientSocket.close(); stop = true; mReceiveThread.interrupt(); } catch (IOException e) { e.printStackTrace(); } } } }