基于Laravel+Swoole开发智能家居后端
基于Laravel+Swoole开发智能家居后端
在上一篇<Laravel如何优雅的使用Swoole>中我已经大概谈到了Laravel结合Swoole的用法。
今天,我参与的智能家居项目基本上已经结束了Web服务器及android端的开发(熬了个通宵突击把剩下的做了,好累), 趁热来聊聊基于Laravel+Swoole开发智能家居后端的关键技术点。
16进制ASCII码协议的解析
硬件我不谈,我只需要关心数据解析。如何基于Swoole如果在php中解析16进制的ascii码,这种文章还比较少呢。但核心的部分还是可以整理出来的,关键用到的就是chr()、hexdec()、bin2hex()这3个函数,网上还提到了用pack()、unpack(),因为前面3个函数以及很好的解决了问题,所以就没有继续深入。我建议在这里Php Manual官网先熟悉下这几个函数。
chr()函数从不同的 ASCII 值返回字符,hexdec() 函数把十六进制转换为十进制。通常结合这两个函数把16进制字符串转换为ASCII字符串,理解起来有点绕。
例如: echo chr(hexdec('fe'));//输出的就是下位机能认识的16进制的FE,大小写不敏感 bin2hex()函数把 ASCII 字符的字符串转换为十六进制值,用于从Swoole中读取数据的转换。
例如:$buffer = str_split(bin2hex($data), 2);//$data是Swoole中OnReceive事件传递的值
在解析协议时,上例中的$buffer数组中,存放了协议的每一位。那么怎么解析呢?最快最懒的方法就是根据硬件研发的协议一位一位的去读取数据,例如头是第一位,那么就是$buffer[0];如果连着好几位组合起来是数据,就写个小函数拼。
是不是太弱鸡了点(.NET和JAVA有很丰富的byte[]转整形和字符串的方法集)?如果你需要,可以自己写个转换工具类出来(我暂时用不上就没整理)。
在下位机通信中还有一个很重要的技术点就是XOR校验,我是从stackoverflow找到的源码,直接贴地址。
16进制ASCII码协议的创建
不废话,直接上代码:
对Laravel使用者,在这部分我强烈建议好好复习一下Laravel提供的快速数组函数辅助方法。
与硬件的曲线通信
基于Swoole接收数据在上一篇中已经详细介绍不再累述,这里主要说说向硬件发送数据的问题。上一篇中,我提到了2种方法,一种是利用fsockopen()函数;一种是内部端口监听。这里还和搞硬件的大神闹了个笑话,脸红啊..对基于TCP/IP协议的通信,因为端口一直被接收监听占用,所以用fsockopen()或者socket_write()函数是行不通的,必须基于第二种方式曲线实现硬件通信。


在Innerhandler中,若接收到需要发送到硬件的命令(就是上一节说的数据),从缓存里面提取该硬件的连接实体,然后发送数据(不知所云请参考Swoole文档)。
这里比较曲线的情况就是在这个缓存,这个缓存是在需要发送数据的时候设定的,那么怎么知道硬件的连接实体是什么?当然是保持一个KV结构的数据啦:)
整个曲线的通信过程就是:当需要向硬件发送数据的时候,首先将数据发送到这个内部监听端口来,然后再从这里发送到硬件去。
怎么向内部监听端口发送数据呢?用fsockopen()或者socket_write()都是完全没问题的,这里的代码就请自行搜索,权当练习,不要太懒了。
Event大有裨益
这个要用过了才知道有多方便,来这里先好好复习一下。实现过程请自行感受,我就只说说我哪里用到了Event:
1.基于JPUSH推送消息
2.向内部监听发送数据
另外只补充一点,想利用Event通过Swoole发送数据的路是行不通的。
优雅的快速测试
由于PHP是弱类型,因此理解起来比较费解。接收数据和向硬件发送数据的数据类型是不一样的。用bin2hex()得到的是形如"11 00 00 FE"的字符串,用chr(hexdec())得到的是16进制的ASCII码,如果echo输出的话,会是乱码。那么如何测试(看到)自己生成的16进制ASCII码数据是否正确呢?1种是找一个TCP/IP工具发送过去,这种麻烦了点,我推荐用fiddler监听。
你可以快速方便的用一个web页面输出你的ASCII码,在fiddler的HexView中,就可以看到原汁原味你发送的16进制数据了。另外,由于Swoole的监听类是CLI运行,因此我也非常推荐多写一点echo打印一下状态,在phpstorm的SSH客户端里可以快速的了解目前的情况,就像android-studio的Loger一样。
echo Carbon::now() . '/Device Numbers:' . $devNum . PHP_EOL;//老司机劝你多写点,最好packagist找个轮子或者自己写个Logger库
鲁棒性探讨,可以搞得非常复杂
算吐个槽吧,前年用.NET做下位机数据处理鲁棒性的时候真是如坐针毡啊。搞下位机通信果然还是c++最合适啊,以下问题在这里还需要后期逐步完善呢:
1.如果硬件发送的数据不是一个包发完而是分批发怎么办?
2.看门狗是一定要写的,对吧?
3.与硬件通信的response处理要做吧?
4.TimeOut怎么办?
....
啊啊啊啊啊....
喜欢Android的有福了
预告下,基于学习的目的,最近正在仿鲜城、enjoy、半糖这3个很有代表性的电商APP首页UI(是逆向着看smali和提取res在仿哟)。
鲜城的android端已经做的有模有样了,这次是逼着自己android、ios都给仿出来,没老司机带就自己想办法提高。
先做android的,有兴趣的朋友可以耐心等待代码和文章。
基于Laravel+Swoole开发智能家居后端的更多相关文章
- 基于能量收集的智能家居-2013国家级大学生创业实践项目申报_商业计划书_V0.2
SmartHome项目商业计划 基于能量收集的 免电池无线智能家居系统 IA-SmartHome团队 2012.12 l 基于无线的智能家居解决方案,节省施工成本: l 基于能 ...
- Android开发—智能家居系列】(二):用手机对WIFI模块进行配置
在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...
- 【Android开发—智能家居系列】(一):智能家居原理
来到JCZB公司的第二天,就接到了开发类似于小米智能家庭APP的任务.组长让我在手机上安装上此款APP,给了我个小米智能插座,就让我开始了解需求.这便开启了我的智能家居旅程.说实话,我也真是out的无 ...
- 【Android开发—智能家居系列】(四):UDP通信发送指令
思路回顾 [1]手机连接WIFI模块 [2]UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 [3]UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 [4]发送指 ...
- 【Android开发—智能家居系列】(三):手机连接WIFI模块
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有 ...
- 智能家居APP开发
智能家居APP开发 APP开发技术qq交流群:347072638 前言,随着智能硬件设备的流行,智能家居開始红火,智能家居就是家用电器的智能化.包含智能锁,灯,空调,灯,音箱等等,移动设备通过WIFI ...
- 智能家居中的物联网网关的可信计算平台模块(TPM)设计
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/BlueCloudMatrix/article/details/24184461 摘要: 随着智能家居 ...
- 硬纪元AI峰会前瞻:如何才能做好智能家居?用户体验最重要
用户体验不到位,市场就不能说真的发展起来. 可以明显的感觉到,随着人工智能.物联网等技术的发展和应用,我们的生活正在发生翻天覆地的变化,其中感觉最为明显的就是智能家居. 据前瞻产业研究院的数据统计,我 ...
- 基于 Laravel、Vue.js开发的全新社交系统----ThinkSNS+
什么是ThinkSNS+ ThinkSNS(简称TS)始于2008年,一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+.新的产品名 ...
随机推荐
- fopen()、 file_get_contents() 通过url获取链接内容
功能:获得网页内容 区别如下: fopen()打开URL 下面是一个使用fopen()打开URL的例子: <?php $fh = fopen('http://www.baidu.com/', ' ...
- hadoop2.4.1集群搭建
准备Linux环境 修改主机名: $ vim /etc/sysconfig/network NETWORKING=yes HOSTNAME=hadoop001 修改IP: # vim /etc/sys ...
- <a>标签,鼠标经过或者停留触发延时响应事件
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcUAAAEoCAIAAACmeX2PAAAgAElEQVR4nOzdd3xUdb74f3+Pu3v33t ...
- DOS命令批量重命名文件配合Excel 操作备忘
批量取得文件夹下文件名 有时候文件夹下有好多图片什么的,文件名称不是统一的格式,想统一一下,于是google找到以下方法,进入要操作的目录,按住shift键的同时,单击鼠标右键,你会看到在此处打开命令 ...
- HTTP 请求报文 响应报文
引言 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发 ...
- 一:c语言(数据类型和运算符)
#include <stdio.h> /*就是一条预处理命令,它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作.*/ int main() /*C程序就是执行主函数 ...
- 查看linux系统,服务,配置文件被修改的时间
如何查看服务启动时间 [root@qike /]# ps -ef |grep nginx root 14730 1 0 16:45 ? 00:00:00 nginx: master process / ...
- Neutron分析(5)—— neutron-l3-agent中的iptables
一.iptables简介 1.iptables数据包处理流程 以本机为目的的包,由上至下,走左边的路 本机产生的包,从local process开始走左边的路 本机转发的包,由上至下走右边的路 简化流 ...
- Android初涉及之Android Studio&JAVA入门--二月不能不写东西
是的,我还没有放弃写博客. 是的,我也没有放弃PHP的学习. 是的,我要开始学学最TM火的Android开发了. 你呢 1.Android Studio 一.概况 安装和配置什么的就不具体说了,网上一 ...
- 大一上学期的一点小疑惑,代码验证ok
#include<iostream> using namespace std; class test { int *p; int pn; public: test(int n) { p = ...