Android利用Socket与硬件通信之智能家居APP
前几天做一个智能家居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发现发送过来的信息是直接当字符串处理,不会再转义,也就\"是代表\",
所以只需发送下面格式信息即可解析
接下来是是代码,代码比较容易,连接局域网(WIFI或者热点都行) 这里的代码是基于知道硬件ip和port上的,当然你也可以通过UDP广播去获取ip和port。
Socket连接也属于网络连接,必须放在子线程中。 注意在清单文件配置网络和WIFI权限
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);
}
}
};
Android利用Socket与硬件通信之智能家居APP的更多相关文章
- 利用Socket与硬件通信(智能家居)
前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信. 我是通过XCOM v2.0 发送信息,移动端接收 ...
- Android开发SDK接入机智云,智能家居实现APP远程控制多设备
代码地址如下:http://www.demodashi.com/demo/12847.html 一.前言. 此框架只用了一周星期做了出来,因为对机智云的框架比较熟悉了 !期间SDK初始化出了问题,去咨 ...
- 智能家居APP开发
智能家居APP开发 APP开发技术qq交流群:347072638 前言,随着智能硬件设备的流行,智能家居開始红火,智能家居就是家用电器的智能化.包含智能锁,灯,空调,灯,音箱等等,移动设备通过WIFI ...
- 智能家居-1.基于esp8266的语音控制系统(开篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) apache-apollo安 ...
- 入门智能家居,从 IFTTT 到 HomeKit 自动化(二)
入门智能家居,从 IFTTT 到 HomeKit 自动化(二) 目录 0. HomeKit.HomeBridge.HomeAssistant 分别是什么?关系是什么? 1. 开始前的准备 2. 整 ...
- Android 之 Socket 通信
Android 之 Socket 通信 联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket Server ...
- 基于android的Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户 ...
- Android中Socket通信之TCP与UDP传输原理
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- Android 进阶12:进程通信之 Socket (顺便回顾 TCP UDP)
不要害怕困难,这是你进步的机会! 读完本文你将了解: OSI 七层网络模型 TCPIP 四层模型 TCP 协议 TCP 的三次握手 TCP 的四次挥手 UDP 协议 Socket 简介 Socket ...
随机推荐
- 代码块、继承、this、super、final(java基础知识八)
1.代码块的概述和分类 * A:代码块概述 * 在Java中,使用{}括起来的代码被称为代码块.* B:代码块分类 * 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块( ...
- 一步一步学Silverlight 2系列(27):使用Brush进行填充
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- oracle:rman恢复----通过时间set until time
试验计划:先做一个0级备份,再创建一个表,插入几条数据,最后删除表,然后通过rman把该表的数据恢复. 试验环境:在归档模式,oracle10.2.0.1 开始试验: 1.rman level 0备份 ...
- Oracle dbf文件删除后,启动服务ORA-01157问题
有一个数据库硬盘空间满了,查看发现一个dbf超大,并且不在规定的路径下,知道是一个非重要数据文件,于是删除. 后来重启数据库时, SQL> startupORACLE instance star ...
- MD5Util1
package com.cc.hkjc.util; import java.math.BigInteger;import java.security.MessageDigest;import java ...
- javascript之数组的6种去重方法
去重 var arr=[11,11,333,4,4,5,66,66,7]; // 方法一:在新数组内判断不存在时加入 var newarr1=[]; function quchong1(){ for( ...
- MongoDB复制集安全认证
之前我有一篇博客写的是“node.js通过权限验证连接MongoDB”,这篇博客上提到如何在启动文件中通过配置auth参数来开启权限认证,但这种认证方式只适合单机节点,当我们使用复制集时应该怎么开启权 ...
- Windows远程服务器不能复制粘贴
操作步骤: 在服务器上打开任务管理器,查看进程,有 rdpclip.exe 进程,关闭此进程: 然后 开始->运行->rdpclip.exe 重新运行此程序,恢复正常.
- Eclipse中,Open Type(Ctrl+Shift+T)失效后做法。
好几天ctrl shift T都不好用了,一直认为是工程的问题,没太在意,反正ctrl shift R也可也,今天看同事的好用,于是到网上查了一下解决的方法,刚才试了一下,应该是这个问题,明天就去公司 ...
- Codeforces702C【二分】
题意: 给你几个城市,蜂窝塔量: 给出城市和塔的坐标可以重叠,非递减的方式给出: 输出最小的r,以至于所有的城市能被覆盖到: 思路: 目的就是要使每个城市覆盖到,那我对每个城市找离最近塔的距离,然后在 ...