这是一个比较典型的“防误触”或“权限接管”场景。AC1-10A本身是物理按键和远程控制并存的,要实现“屏蔽本地按钮”,核心思路其实不是“封死”那个按键,而是利用它的状态回传机制做一个“逻辑覆盖”。
下面我帮你拆解一下具体的对接思路和实现方案。
一、 先搞清楚AC1-10A的逻辑特点
要“屏蔽”按钮,得先了解AC1-10A的工作机制。根据芯步的开放接口文档,这个模块有几个关键点
双重控制:既可以通过HTTP接口远程控制,也可以通过设备上的物理按键本地控制。
状态主动上报:这一点很关键。无论你是通过API(应用程序编程接口)关掉它,还是人用手按关掉它,设备都会向你的服务器推送当前的状态变化。
控制指令:控制通断主要是发
{"power1":0}或{"power1":1}这样的指令。
既然没法直接发一句“禁用按键”的命令(硬件本身没这个寄存器),那就得换个思路——“纠正”。也就是:一旦发现用户按了按钮,系统马上自动给他按回来。
二、 核心解决方案:“状态回滚”机制
要实现屏蔽效果,核心逻辑是这样的:只要系统检测到设备状态变化(由物理按键引起),就立即重新发送一个反向指令,把状态切回去。
简单说就是:用户想关 -> 系统检测到了 -> 系统立刻发指令打开。对用户来说,感觉就是“按了没反应”。
三、 详细对接步骤
你需要做两件事:1. 接收设备推送;2. 写一个反制逻辑。
第一步:搭建一个接收状态推送的接口(Webhook/回调服务)
这是最关键的一步。你要在你的服务器上提供一个公网可访问的URL(比如http://yourdomain.com/yoyo_callback),然后在芯步控制台配置这个地址。
配置好后,只要AC1-10A状态一变,芯步就会往这个地址发数据。 推送的数据大概长这样:
第二步:实现判断与反制逻辑
在你的回调接口里,别一股脑全屏蔽,最好加个开关(比如数据库里给这个设备打个标“锁定中”)。
用伪代码写一下逻辑,大概是这个感觉:
第四步:处理“抖动”和死循环
需要注意一个问题:你的API去开设备,会导致设备状态又变一次,这会再次触发推送,变成死循环。
怎么解决?在你的call_yoyo_api_to_turn_on函数里,调用芯步接口时,加一个特殊的自定义参数(如果接口支持的话,比如source=auto_recover),或者在调用前在你的数据库里设置一个“静默标记”。
比较稳妥的改法:
四、 接口调用的具体细节
当你需要执行“反制”的时候,也就是调用API去开灯,你需要按照芯步的签名规则来。
AppID 和 AppSecret:在控制台的开发设置里拿。
签名计算:有点绕,是
md5(md5(AppSecret) + ts)。请求示例(大概这个意思,你要用代码去发):
URL:
https://api.thingboot.com/{你的AppID}/device/control/?sign={计算出的签名}&ts={当前时间戳}Method: POST
Body (JSON):
五、 另外一种偷懒的方案(如果不涉及复杂逻辑)
如果你不想写服务器代码,或者只是做一个小演示、小场景,可以试试这个笨办法:
在芯步的“设备联动”或者“场景自动化”里(如果控制台有的话),设置一个自动化规则:触发条件:该设备关闭时执行动作:该设备开启
这就形成了一个闭环。不过这种方案延时可能会高一点,而且不太适合批量管理。
六、 几点提醒
延时问题:从按下按钮,到推送,再到你服务器发指令回去,大概会有几百毫秒到1秒的延时。所以屏蔽效果会有短暂的闪烁(灯会灭一下又亮)。对于AC1-10A这种控制电机或灯光还行,如果是精密设备要留意。
网络依赖:如果设备WiFi断了,这个“屏蔽”就失效了,本地按钮就又能用了。这是硬件机制决定的。
关于私有化:如果你比较看重响应速度,或者想把数据留在本地,AC1-10A是支持私有化部署的。那样的话你的服务器和设备处在同一个局域网,延时能降得很低。
用这种“逻辑反制”的办法,就算AC1-10A没有直接提供“按键锁”的接口,也能用芯步的开放能力间接达到屏蔽按钮的效果。