前几天做一个智能家居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);
} }
};

利用Socket与硬件通信(智能家居)的更多相关文章

  1. Android利用Socket与硬件通信之智能家居APP

    前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信. 我是通过XCOM v2.0 发送信息,移动端接收 ...

  2. 利用Node.js对某智能家居服务器重构

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理. 移动端和机顶盒的远程通信是用 ...

  3. 利用Node.js对某智能家居server重构

    原文摘自我的前端博客,欢迎大家来訪问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的.我们主要开发server监控和集群版管理. 移动端和机顶盒的远程通 ...

  4. 智能家居-2.基于esp8266的语音控制系统(硬件篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...

  5. 智能家居-1.基于esp8266的语音控制系统(开篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) apache-apollo安 ...

  6. Home Assistant + 树莓派:强大的智能家居系统 · 安装篇

    Home Assistant + 树莓派:强大的智能家居系统 · 安装篇 转载:Home Assistant + 树莓派:强大的智能家居系统 · 安装篇 目录 1. 初始安装 3. Homebridg ...

  7. 智能家居-3.基于esp8266的语音控制系统(软件篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...

  8. 高度集成智能家居物联网网关WiFi通信应用的无线路由模块:模小块成长记

    大家好,我叫模小块,代号L107模块,出生在BOJINGnet大家庭里,我在物联网网关里不可或缺,或许业内专业人士和物联网工程师知道我的存在.别看我体积小(40mm25mm3mm),贴片式邮票孔接口( ...

  9. Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信

    Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...

随机推荐

  1. SQL Server 手把手教你使用profile进行性能监控

    200 ? "200px" : this.width)!important;} --> 介绍 经常会有人问profile工具该怎么使用?有没有方法获取性能差的sql的问题.自 ...

  2. Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

    前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...

  3. 设备文件三大结构:inode,file,file_operations

    驱动程序就是向下控制硬件,向上提供接口,这里的向上提供的接口最终对应到应用层有三种方式:设备文件,/proc,/sys,其中最常用的就是使用设备文件,而Linux设备中用的最多的就是字符设备,本文就以 ...

  4. [JQuery]Jquery对象和dom对象

    jquery对象是jquery包装dom对象后产生的对象,它们都只能使用各自的方法. 1.定义变量时,通过$来区分: var $variable = jquery对象: var variable = ...

  5. [html5]学习笔记一 新增的主题结构元素

    html5 新增的主体结构元素有:article,section,nav,aside,time,pubdate元素. 1. article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引 ...

  6. LoadRunner 调用Dll完成加密解密

    LoadRunner里的函数比较少,没有MD5.Base64加密. 我们可以通过在C++里把一些加解密写成函数,供LR调用. DLL函数编写 C++里新建工程Class Library(此处是用VS2 ...

  7. MongoDB基础之六 索引

    一 . 索引概述和基本操作 1. 索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引2. 在mongodb中,索引可以按字段升序/降序来创建,便于排序3. 默认是用btree来组 ...

  8. 提升iOS审核通过率之“IPv6兼容测试”

    作者:jingle 腾讯系统测试工程师 商业转载请联系腾讯WeTest授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/285.html 一.背景 在 ...

  9. php处理登录、添加数据、删除数据和修改数据

    php 处理登录 :需要先建一个登录的页面,用form表单就可以很轻松的完成,(这里的示例是我根据数据库现成的表做的 是一个teacher表格 根据老师的工号和姓名登录的) <form acti ...

  10. dev简单实现柱状图,曲线图

    1.数据源代码: DataTable dt = new DataTable(); dt.Columns.Add("A"); dt.Columns.Add("B" ...