手机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();
}
}
}
}