利用Socket与硬件通信(智能家居)
前几天做一个智能家居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);
}
}
};
利用Socket与硬件通信(智能家居)的更多相关文章
- Android利用Socket与硬件通信之智能家居APP
前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信. 我是通过XCOM v2.0 发送信息,移动端接收 ...
- 利用Node.js对某智能家居服务器重构
原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理. 移动端和机顶盒的远程通信是用 ...
- 利用Node.js对某智能家居server重构
原文摘自我的前端博客,欢迎大家来訪问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的.我们主要开发server监控和集群版管理. 移动端和机顶盒的远程通 ...
- 智能家居-2.基于esp8266的语音控制系统(硬件篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...
- 智能家居-1.基于esp8266的语音控制系统(开篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) apache-apollo安 ...
- Home Assistant + 树莓派:强大的智能家居系统 · 安装篇
Home Assistant + 树莓派:强大的智能家居系统 · 安装篇 转载:Home Assistant + 树莓派:强大的智能家居系统 · 安装篇 目录 1. 初始安装 3. Homebridg ...
- 智能家居-3.基于esp8266的语音控制系统(软件篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...
- 高度集成智能家居物联网网关WiFi通信应用的无线路由模块:模小块成长记
大家好,我叫模小块,代号L107模块,出生在BOJINGnet大家庭里,我在物联网网关里不可或缺,或许业内专业人士和物联网工程师知道我的存在.别看我体积小(40mm25mm3mm),贴片式邮票孔接口( ...
- Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信
Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...
随机推荐
- MySQL数据类型--日期时间
一.博客前言 自接触学习MySQL已有一段时间了,对于MySQL的基础知识还是略懂略懂的.在这一路学习过来,每次不管看书还是网上看的资料,对于MySQL数据类型中的时间日期类型总是一扫而过,不曾停下来 ...
- android.os.NetworkOnMainThreadException 异常
记下来以后备用 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectD ...
- [个人翻译]GitHub指导文件(GitHub Guides[Hello World])
[个人翻译]GitHub指导文件(GitHub Guides[Hello World]) Mirage_j个人翻译,欢迎转载,最好标明出处http://www.cnblogs.com/mirageJ/ ...
- 使用fullPage.js遇到的问题以及翻译
使用fullPage.js做一简单页面,遇一古怪问题:.section中的h1标签始终被一插件生成的标签包裹,导致样式调整好不困难!花费数小时排查为何会生成这样一个标签,最终在fullPage.js的 ...
- 【noip 2009】 乌龟棋 记忆化搜索&动规
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- java udp 发送小数数字(较难)
代码全部来自:http://825635381.iteye.com/blog/2046882,在这里非常感谢了,我运行测试了下,非常正确,谢谢啊 服务端程序: package udpServer; i ...
- python解释器的安装;python2与python3同时在环境变量中时的解决方案
新文档 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,addres ...
- [Linux] PHP程序员玩转Linux系列-怎么安装使用
现在服务器主流都是Linux系统,主流发行版是CentOS,最新的CentOS版本号是7.3,我公司使用的是CentOS6.5,所以,我还是主要去学习6.x版本的CentOS.桌面版的Linux系统中 ...
- oozie配置安装与原理
概述 当前开源的hadoop任务工作流管理主要有oozie和Azkaban,本文先介绍oozie的配置安装与基本运行原理. 配置安装 (参考https://segmentfault.com/a/11 ...
- RAID分类
1. RAID在数据库存储上的应用 随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks, ...