XCray
发表于 2020-7-31 20:45:39
本帖最后由 XCray 于 2020-8-1 08:30 编辑
dscao 发表于 2020-7-30 17:42
今天发现个问题,换了MQTT服务器的IP后,重新配置 MQTT服务器的IP总是改不过来。清除wifi配置后再设置或者 ...
OTA不会清除之前保存的设置,哪怕之前是用其他固件设置的,OTA也不会清除。
一般情况下,线刷会清除掉所有设置(其实是线刷前会自动擦除整个flash)。
如果我碰到你说的这种情况,我更倾向于线刷一遍(毕竟折腾wifi信号动静太大,牵涉到太多的东西)
siri10086
发表于 2020-8-2 09:48:10
XCray 发表于 2020-7-31 20:38
两天没来论坛,好几个朋友问问题啊。
~~~~~~~~~~~~~~~~~~~~~~~~~
绿米的N100门锁,我给你看下开关门NR接收到的信息。
topic: "mqttl/1011358567/11"
payload: "5f26199900000000a4"
qos: 0
retain: false
_msgid: "7c2ef6cf.085028"
====================
topic: "mqttl/1011358567/7"
payload: "5f26199900"
qos: 0
retain: false
_msgid: "56262c2d.00de24"
=================
topic: "mqttl/1011358567/7"
payload: "5f26199d01"
qos: 0
retain: false
_msgid: "94e83f42.524eb"
=================
以上三条是从室内开关门后出现的。
payload里的格式要求进行逆序调整?然后解析字符串么,解析后要怎么对照
siri10086
发表于 2020-8-2 09:53:10
siri10086 发表于 2020-8-2 09:48
绿米的N100门锁,我给你看下开关门NR接收到的信息。
topic: "mqttl/1011358567/11"
payload: "5f261999000 ...
我之前刷的一个用的是下面来解析门锁的,因为不稳定,就换成这个。做了逆序调整然后解析也对照不起来。
let mac = msg.payload.dev.mac;
let eid = msg.payload.evt.eid;
let edata = msg.payload.evt.edata;
let state, method, action, key_id, arert, bolt_state, battery;
let edata1, edata2, edata3;
let time = new Date().Format("yyyy年MM月dd日hh:mm:ss")
msg = {
payload: {}
}
if (eid === 7 || eid === 11 || eid === 4106 || eid === 4110) {
if (eid === 7) {
edata = edata.substring(0, 2);
state = parseInt(edata, 16);
switch (state) {
case 0:
state = "开门";
break;
case 1:
state = "关门";
break;
case 2:
state = "超时未关门";
break;
case 3:
state = "敲门";
break;
case 4:
state = "撬门";
break;
case 5:
state = "门卡住";
break;
}
msg.payload.state = state;
msg.payload.time = time;
msg.topic = "bt/" + mac + "/state"
return msg;
}
if (eid === 11) {
edata1 = edata.substring(0, 1);
edata2 = edata.substring(1, 2);
edata3 = edata.substring(2, 10);
method = parseInt(edata1, 16);
action = parseInt(edata2, 16);
switch (method) {
case 0:
method = "蓝牙";
break;
case 1:
method = "密码";
break;
case 2:
method = "指纹";
break;
case 3:
method = "应急钥匙";
break;
case 4:
method = "转盘方式";
break;
case 5:
method = "NFC";
break;
case 6:
method = "一次性密码";
break;
case 7:
method = "双重验证";
break;
case 10:
method = "人工";
break;
case 11:
method = "自动";
break;
case 15:
method = "异常";
break;
}
switch (action) {
case 0:
action = "开门";
break;
case 1:
action = "上提把手锁门";
break;
case 2:
action = "反锁";
break;
case 3:
action = "解除反锁";
break;
case 4:
action = "室内开门";
break;
case 5:
action = "门内上锁";
break;
case 6:
action = "开启童锁";
break;
case 7:
action = "关闭童锁";
break;
case 15:
action = "异常";
break;
}
if (
edata3.substring(2, 8) === "00dec0" ||
edata3.substring(2, 8) === "10dec0"
) {
edata4 = edata3.substring(1, 2);
arert = parseInt(edata4, 16);
if (edata3.substring(2, 8) === "00dec0") {
switch (arert) {
case 0:
arert = "密码多次验证失败";
break;
case 1:
arert = "指纹多次验证失败";
break;
case 2:
arert = "密码输入超时";
break;
case 3:
arert = "撬锁";
break;
case 4:
arert = "重置按键按下";
break;
case 5:
arert = "有人撬锁或钥匙未拔"; /////钥匙频繁开锁
break;
case 6:
arert = "钥匙孔异物";
break;
case 7:
arert = "钥匙未取出";
break;
case 8:
arert = "NFC设备多次验证失败";
break;
case 9:
arert = "超时未按要求上锁";
break;
}
} else {
switch (arert) {
case 0:
arert = "电量低于10%";
break;
case 1:
arert = "电量低于5%";
break;
case 2:
arert = "指纹传感器异常";
break;
}
}
msg.payload.arert = arert;
msg.payload.time = time;
} else {
key_id = edata3;
///////00000000管理员密码;0a000(1/2)80:0a为第几个密码(指纹+密码),180为指纹,280为密码;00000280一次性密码
msg.payload.event = method + action;
msg.payload.time = time;
if (key_id !== "ffffffff") {
switch (key_id) {
case "00000000":
key = "我";
break;
case "08000180":
key = "我的右手拇指";
break;
case "03000180":
key = "我的左手拇指";
break;
case "01000280":
key = "我的管理员密码";
break;
case "0400280":
key = "客人";
break;
default:
key = key_id;
break;
}
}
msg.payload.key = key;
}
msg.topic = "bt/" + mac + "/event"
return msg;
}
if (eid === 4106) {
edata = edata.substring(0, 2);
battery = parseInt(edata, 16);
msg.payload.battery = battery;
msg.topic = "bt/" + mac + "/battery"
return msg;
}
if (eid === 4110) {
bolt_state = parseInt(edata, 16);
switch (bolt_state) {
case 0:
bolt_state = "所有锁舌收回";
break;
case 4:
bolt_state = "斜舌弹出";
break;
case 5:
bolt_state = "方舌/斜舌弹出";
break;
case 6:
bolt_state = "呆舌/斜舌弹出";
break;
case 7:
bolt_state = "所有锁舌弹出";
break;
}
msg.payload.bolt = bolt_state;
msg.topic = "bt/" + mac + "/bolt"
return msg;
}
}
XCray
发表于 2020-8-2 11:22:08
本帖最后由 XCray 于 2020-8-2 14:38 编辑
siri10086 发表于 2020-8-2 09:48
绿米的N100门锁,我给你看下开关门NR接收到的信息。
topic: "mqttl/1011358567/11"
payload: "5f261999000 ...
其实解析真的不难。
第一条,前面已经分析过了,不妨再仔细说说。
topic最后一段对应的是eid(事件id),这里就是11,根据经验(以及文档),这个就是“锁事件”;payload前面8位是时间戳,5f261999转换成10进制是1596332441,再转换成人类可读的格式,就是“2020-08-02 09:40:41”(你这是刚刚测试的啊~)。
后面的八个0是keyid的位置,最后的“a4”是“操作”的位置,这里a4代表的就是“人工操作、门内开锁”。因为只是门内转把手,所以也就没有具体的KeyID了,所以keyid那儿就只是一串0;
第二条和第三条,eid=7,根据经验和文档,这个是“门事件”。
前面8位仍然是时间戳,第二条的时间戳和第一条是一样的,第三条就是最后一位由9变成了d,也就是说,你开门操作后4秒。
第二条和第三条最后的“00”和“01”,分别代表“开门”和“关门”。
很显然,室内开门后4秒你又把门关上了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
对了,你83楼贴的那一大堆代码现在没啥意义了,那是之前的思路(在esp的程序里进行解析判断)。
gtyun
发表于 2020-8-2 21:24:49
感谢大佬分享
siri10086
发表于 2020-8-3 09:35:35
XCray 发表于 2020-8-2 11:22
其实解析真的不难。
第一条,前面已经分析过了,不妨再仔细说说。
好的 非常感谢 讲解的很详细。文档方便贴一个嘛
XCray
发表于 2020-8-3 16:26:23
siri10086 发表于 2020-8-3 09:35
好的 非常感谢 讲解的很详细。文档方便贴一个嘛
就是小米的官网,iot.mi.com,具体来说,https://iot.mi.com/new/doc/embedded-development/ble/object-definition 这个链接和这个帖子关联最大
elechao
发表于 2020-8-3 17:15:17
感谢楼主分享!
elechao
发表于 2020-8-3 17:17:40
厉害了,学习一下
siri10086
发表于 2020-8-3 17:52:05
XCray 发表于 2020-8-3 16:26
就是小米的官网,iot.mi.com,具体来说,https://iot.mi.com/new/doc/embedded-development/ble/object-d ...
好的 非常感谢