本帖最后由 mozzie 于 2025-2-7 15:10 编辑
家里有个门禁,用的智灵开门进行远程控制,最近打算从AppStore下载app发现已经下架了,咨询了卖家得知该品牌已经倒闭了,服务器还不知道哪天就停了,于是就萌生了部署到本地的想法。
物联网设备多数通过mqtt服务连接到服务器,前期路由器抓包得到了所需的topic和服务器地址,但是没有获取到认证信息。后来抱着试试看的想法把打开了 http://www.jyyltech.com:8080/jyapi/居然打开了WEB端,也顺利的获取到了所需信息。
网页源码截取:
function connect(userid){
var hostname = "47.100.xx.xxx";
var port = 8083;
var clientId = "pcc_"+userid;
var path = "";
var user = window.appId; //网页源码内直接写好了
var pass = window.appSecrit;//网页源码内直接写好了
var keepAlive = 120;
var timeout = 3;
var tls = false;
var cleanSession = true;
var lastWillTopic = "";
var lastWillQos = 0;
var lastWillRetain = false;
var lastWillMessage = "";
<script type="text/javascript">
window.userid = "";
window.productId = "";
window.userpass = "";
window.appId="明文appid"; //对应上面的user
window.appSecrit="明文appSecri";//对应上面的pass
window.wxappId="明文";
window.deviceType = "明文"
window.mgId = "";
window.userStart = 0;
</script
function creatMsgId(){ //消息ID,取随机数,经测试固定ID也没关系。
var messageRandomId = 0;
messageRandomId = Math.random()*999999 + 800;
messageRandomId = parseInt(messageRandomId, 10);
return messageRandomId;
}
function deviceopenlock(deviceId){
subscribe(deviceId);
msgId = creatMsgId();
var msg_body_json ={
"id":window.userid //智灵开门登录手机号
}
var jsondata = {
"msg_id" :msgId,
"msg_type":"set",
"ablity":"open",
"body":msg_body_json
};
分析网页源码获取到了MQTT服务器、用户名和密码,window.appId、window.appSecrit都是以明文形式写死在index.html?Token=这个文件内的。至此,我们获取到了mqtt所需的全部信息。
MQTT服务器:47.100.xx.xxx
MQTT端口:8083
MQTT用户名:明文appid
MQTT密码:明文appSecri
发送主题:`/dev/a/"+window.productId+"/"+deviceid.split(";")[2];`(调试工具终端内可以直接查看)
订阅主题:`"/usr/a/"+window.productId+"/"+deviceid.split(";")[2];`(调试工具终端内可以直接查看)
开锁命令:
`{"msg_id":701234,"msg_type":"set","ablity":"open","body":{"code":1,"msg":"reset","data":""}}`
设备管理内添加mqtt服务器
编辑configuration.yaml
mqtt:
sensor:
- name: "Lock Open Status" #创建传感器,用于监测门锁状态
state_topic: "/usr/a/xxxxxxxx/xxxxxxx" #订阅主题
value_template: >-
{% if value_json.body.msg == "ok" %} #判断收到的消息,如果返回ok即代表开锁成功
Open Success
{% else %}
Closed
{% endif %}
qos: 0
lock:
- name: "门锁"
unique_id: "xxxxxxxx" # 确保每个设备都有唯一的ID
command_topic: "/dev/a/xxxxxx/xxxxxxx"
state_topic: "/usr/a/xxxxxx/xxxxxxx"
value_template: >-
{% if value_json.body.msg == "ok" %}
unlocked
{% else %}
locked
{% endif %}
qos: 1
optimistic: false
payload_unlock: '{"msg_id":701234,"msg_type":"set","ablity":"open","body":{"id":"xxxxxxxxx"}}'
state_locked: "locked"
state_unlocked: "unlocked"
automation:
- alias: "Reset Lock Open Status After 30 Seconds" #自动刷新门锁状态
trigger:
platform: state
entity_id: sensor.lock_open_status
to: 'Open Success'
action:
- delay: 00:00:30
- service: mqtt.publish
data:
topic: "/usr/a/xxxxxx/xxxxxxxx"
payload: '{"body":{"msg":"reset"}}'
至此,设备接入homeassistant完成。
20250707更新:
因为homeassistant限制只能连接一个MQTT服务器,不少人本身已经有业务在跑了,也就导致了没办法按照这个流程来走了,这时候我们可以通过NodeRed来实现。
实现过程:
1、上述流程保持不变,但不需要连接新的MQTTT服务器
2、nodered下,连接两个MQTT服务器,分别是本机MQTT和远程MQTT服务
3、画四个MQTT节点如下:
MQTT out节点 连接远程服务器,主题为/dev/xxxxxxx
MQTT In节点 连接本机服务器,主题同上。
上述两个节点相连
MQTT out节点 连接本地服务器,主题为/usr/a/xxxxxx
MQTT in节点 连接远程服务器,主题同上
上述两个节点相连
|