博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android利用Socket与硬件通信之智能家居APP
阅读量:4913 次
发布时间:2019-06-11

本文共 3378 字,大约阅读时间需要 11 分钟。

   前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信。

我是通过XCOM v2.0 发送信息,移动端接收信息后也可以发信息过去,界面如下(比较简单自己写就行)

 

这是个简单的通信实现,当然也可以通过广播UDP来获取IP地址,这样IP地址不用固定输入,github的上的ESP8266-Sample注册WiFi后也可以获取到IP地址。

外网连接可以参照http://123.57.52.126/ ,与服务器123.57.52.126,端口3200,建立TCP连接,之后通过以下命令分别进行注册、登陆(下图)

 

大概步骤如下,感兴趣可以自己研究:

APP端用户名固定为“CKJ”和MAC地址中的第一个和最后两个字符的组合

例如MAC地址为5c:cf:7f:88:ea:ca时,用户名为CKJ5ceaca,这样做是为了尽可能避免账号冲突。                                                  

登陆完成后可通过{“re”:1}命令测试网关是否在线,如果网关在线,将会应答{“re”:1,“us”:”CKJ5ceaca”}。

外网通信时每一个发送出去的json前都必须加上d%username%,json里必须包含自己的账号。其中user为网关用户名内容,例如d%username{“re”:1,“us”:”CKJxxxxxx”}

对端收到的数据不包含前面的d%username%,只有json数据,可以直接解析。

其它的json数据和局域网下相同,与网关通信时必须建立TCP连接,UDP广播只用于寻找网关。

 

遇到了一个小问题(不用通过XCOM v2.0发送json字符串的跳过)

  与硬件通信肯定免不了解析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权限
 
发送信息的代码(发送给硬件端WIFi模块的,可在XCOM v2.0显示):
new Thread(){                @Override                public void run() {                    super.run();                    byte[] msgBuffer = null;                    String text = "---------Hello World---------- ";                    try {                        msgBuffer = text.getBytes("GB2312");                        clientSocket = new Socket("192.168.191.2", 3001);                        outStrean = clientSocket.getOutputStream();                        outStrean.write(msgBuffer);                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }.start();

 

接收信息代码(接收硬件端发过来的信息):

public class ReceiveThread extends Thread {        private InputStream inStrean = null;        private byte[] buf;        private String str = null;        public ReceiveThread(Socket s) {            try {                this.inStrean = s.getInputStream();            } catch (IOException e) {                e.printStackTrace();            }        }        //将输入流转化为字符串        @Override        public void run() {            super.run();            while (!stop) {                this.buf = new byte[1024];                try {                    this.inStrean.read(this.buf);                } catch (IOException e) {                    e.printStackTrace();                }                try {                    this.str = new String(this.buf, "GB2312").trim();                } catch (UnsupportedEncodingException e) {                    e.printStackTrace();                }                Message msg = new Message(); //将获取到的字符串str通过sendMessage发送出去                msg.obj = str;                mHandle.sendMessage(msg);            }        }    }

 

接收sendMessage发过来的数据并解析

private Handler mHandle = new Handler() {        @Override        public void handleMessage(Message msg) {            String jsonString = msg.obj.toString();            System.out.println("显示接收到的json字符串"+ jsonString);           //若接收的不是json格式字符,不需要解析,不然奔溃掉            if(jsonString != "") {                 Json(jsonString);              }                 }    };

 

 

 

转载于:https://www.cnblogs.com/wujiancheng/p/6558282.html

你可能感兴趣的文章
分表统计查询
查看>>
ToolStrip 选中某一项打勾
查看>>
Android中设定EditText的输入长度 分类: Android...
查看>>
第7章例7-12
查看>>
IT行业概念、岗位、职能
查看>>
ReactiveCocoa实战: 模仿 "花瓣",重写 LeanCloud Rest Api的iOS REST Client.
查看>>
前端加解密方案探讨
查看>>
WPF Window对象
查看>>
论文笔记:Emotion Recognition From Speech With Recurrent Neural Networks
查看>>
Coursera台大机器学习课程笔记9 -- Logistic Regression
查看>>
卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning(转)...
查看>>
ZigZag Conversion
查看>>
LSTM
查看>>
JavaScript 的 this 原理
查看>>
JavaScript中的设计模式:状态模式
查看>>
iOS开发之代码加载方式进入APP的界面
查看>>
续:双缓存队列_模板类
查看>>
【公众号系列】SAP将裁员4400人,颤抖吧!
查看>>
Ubuntu 15.04 开机无法进入图形界面,自动进入emergency mode解决方法
查看>>
Android在listview添加checkbox实现单选多选操作问题
查看>>