[目标]
透过android设备,实现对某一开关量的控制,达到给电子门锁通电打开的目的。
网络开关量控制器如下:
image.png
本质上就是一个把以太网协议转换成对输出开关量的动作的硬件模块。
[设备]
NR01 网络开关量控制器。含以太网口一个
普通家用路由器,型号TP- LINK WR541G+(10年前的型号了)
商用android设备一台
[设计思路]
虽然开关量控制器提供ModBus协议,但是给android来控制,有点大材小用了。
直接用它提供的UDP模式,发个包控制继电器输出开一下,给门锁信号就行了。
根据网络开关量控制器报文,android设备发送一个UDP包on1:01 代表1号继电器开发闭合1秒。
如果网络开发控制器收到了,就回应一个UDP包,内容是on1
分为一个UDP发送线程和一个UDP接收线程。 发送一次,就等待接收一会儿。收到on1就不再发送UDP开锁包了。超时收不到就再发送一次。即使UDP经常丢包,在局域网里,试3次到5次也够了。
[实做]
UDP发送很简单,网上文章很多。接收也描述的很多,不过好多是描述对UDP支持多么的不好。
这次用的是Android一个商用设备,对系统篡改少一些。
[踩坑]
最主要的是DatagramSocket对发送和接收来讲一定只用一个实例
否则代码中UDP一个字节都接收不到。
至于发送和接收是1个线程还是2个线程,并不重要。
[代码]
ShopDoor.java
/*******************************************************************************
* Copyright 2018 Stephen Zhu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*