php怎么跟硬件交互

ecuca

做了一个共享台球厅的项目,解决了小程序端来实现操作硬件的问题,今天就来分享给大家。

准备工作如下:
1.客户端:小程序端
2.开发语言:PHP
3.第三方平台:统软云物联网
4.设备:WIFI通断器,WIFI墙壁开关,WIFI墙插
5.对接方式:API接口

统软云wifi通断器,100左右一台,就是一个可以连wifi,可通过接口和小程序远程控制的继电器,控制包间的电磁锁。电磁锁淘宝上有卖,50-80一把,什么门都能装;主要是这个通断器支持多种指令:打开,关闭,延时打开,延时关闭;这样的话断电上锁和通电上锁的模式都可以解决。

统软云wifi墙壁开关,120一台,有一路二路三路的,分别可控制对应路数的灯光,同样可以连无线,可通过小程序和接口远程控制,订单到期后自动关闭,客人仍然可通过按下开关再次开灯,但1分钟后仍然后自动关闭,很银性。

统软云wifi墙插,150一台,跟普通的墙壁插座外观上没有任何区别,但可以连无线,可通过接口和小程序远程控制,机麻、饮水机等电器插上面就可以远程控制其通电了;

先看官方文档:

消息推送【上行】
当设备状态发生变化时,平台将会把以下4类消息推送到您设置的地址上
注意:相应是实时推送的,如果推送失败,将再次尝试推送,直到推送成功,最多推送5次。 当返回状态HTTP 1.1 200 OK(只判断HTTP状态)时,就认为推送成功,所以没有返回值要求。
1.上/下线消息
2.指令执行消息
3.设备触发的事件消息
4.设备自主上报的状态消息

设备管理【下发】
设备管理 - 获取设备列表
接口地址: http://iot-api.unisoft.cn/EtwYEFmu61/device/list/?sign={sign}&ts={ts}关于sign和ts的定义
请求参数
名称 必填 类型 说明
tag 0 string 可指定标签,传标签ID
group 0 string 可指定分组,传分组ID
page_index 0 int 页码,默认1
page_size 0 int 默认10条,可为20、30、50
设备管理 - 向设备下发指令
接口地址: http://iot-api.unisoft.cn/EtwYEFmu61/device/control/?sign={sign}&ts={ts}
请求参数
名称 必填 类型 说明
device 1 string 设备ID,设备列表接口获取
sync 0 int 为1时(默认),同步返回指令执行结果;为0时(需指定),只返回是否下发成功,而不返回指令执行结果
属性 1 string 命令,格式为 设备的属性名称=属性值;在设备详情页,可查询设备的可用指令以及可用的值;如power=1,则下发命令接通设备电源

看了文档之后我们就会发现,有两方面需要处理:

1.设备的状态等变更是会通知给我们指定的地址,我们在指定的地址POST接受数据然后做数据处理就可以,所以这里就不细说了,如果有不清楚的可以参考官方文档
2.控制设备下发指令,给设备下发指令控制设备,我们主要说一下这里。

对接前需要注意的有几点,大家一定要注意。

1.一定先给设备配网,也就是联网,设备都是支持WIFI的,所以配网很简单,微信小程序进入“统软云物联”小程序,添加设备就可以。
2.统软云物联网平台创建工作台,获取APPID和设置开发者密码还有设置IP白名单,填写上行消息接收地址。
3.给设备下发的指令在设备详情页,可查询设备的可用指令以及可用的值,一般常用的就4个:打开power=1,关闭power=0,延时5秒打开reset=5000,延时5秒关闭point=5000。

下面上代码:

//1、获取设备列表
//准备数据,https://iot.unisoft.cn/developer/处获取
$app_id = "qtyVWasgeMqs"; //统软云物联网平台获取自己的APPID
$AppSecret = "shasadas"; //统软云物联网平台获取自己的开发者密码
$ts = time(); //请求时间(timezone,东八区),10位数字
$sign = md5(md5($AppSecret).$ts); //md5(md5(开发者密码) + 上面的ts参数),32位字符串
//组装请求地址
$url = "http://iot-api.unisoft.cn/".$app_id."/device/list/?sign=".$sign."&ts=".$ts;
//GET传参请求,可选参数tag,group,page_index,page_size,具体的看文档
$headerArray =array("Content-type:application/json;","Accept:application/json");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output,true);
//返回参数code == 200 就OK了
if ($output["code"] == 200) {
/**这里开始处理自己的应用逻辑*/
/**这里开始处理自己的应用逻辑*/
}

//2.下发指令给设备,打开,关闭,延时打开,延时关闭
//准备数据,https://iot.unisoft.cn/developer/处获取
$app_id = "qtyVWasgeMqs"; //统软云物联网平台获取自己的APPID
$AppSecret = "shasadas"; //统软云物联网平台获取自己的开发者密码
$ts = time(); //请求时间(timezone,东八区),10位数字
$sign = md5(md5($AppSecret).$ts); //md5(md5(开发者密码) + 上面的ts参数),32位字符串
//请求地址 URL+接口名称
$url = "http://iot-api.unisoft.cn/".$app_id."/device/control/?sign=".$sign."&ts=".$ts;
//准备参数
$data = array(
"device" => 1,//设备ID,读取设备列表时返回的ID
"sync" => 1,//同步返回指令执行结果,默认为1,不需要改动,当sync为1(同步执行)方式下,才会返回指令执行结果
"power" => 1,//设备指令,在设备详情页,可查询设备的可用指令以及可用的值,如打开power=1,关闭power=0,延时5秒打开reset=5000,延时5秒关闭point=5000
);
$data = json_encode($data);
//开始发送请求,注意这里是POST请求方式
$headerArray =array("Content-type:application/json;charset=utf-8","Accept:application/json");
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
$output = json_decode($output,true);
//返回参数code == 200 就OK了
if ($output["code"] == 200) {
/**这里开始处理自己的应用逻辑*/
/**这里开始处理自己的应用逻辑*/
}

其他的操作小伙伴们直接看文档吧,调用方式还是很简单,URL+自己的APPI_ID+签名sign+时间戳ts,然后注意是GET还是POST请求方式,然后把参数带进去就OK,个人觉得还是很简单,小伙伴们快去试试吧!
如果对接中有什么问题,欢迎留言!

988 3 2
3个评论

稚出

mark

  • 暂无评论
小W

说实话,这项目PHP与硬件没有任何关系

  • 暂无评论
adobe

可以用MQTT协议实现

  • 暂无评论

ecuca

220
积分
0
获赞数
0
粉丝数
2023-08-05 加入
🔝