屏幕挂灯无法使用局域网控制

谢谢,我晚上详细表述一下复现过程。

這是基礎版的固件嗎?我Pro版還是看不到0015版本, 已經連上大陸server了
id: 1618645786

telnet 测试暂时没有问题,多半是lib的问题。辛苦了。

hello, @_guofeng

感谢你 15 版本的固件。

经研究,发现问题是这样的:若 socket 建立后立即发送指令,则设备不会响应指令。直到 socket 被强行关闭后(如 timeout 或手动关闭),设备会响应上一条未执行的指令,但此时无法收到 response。

如果在 connect() 之后,sleep 十毫秒左右再发出指令,此时设备能正常 response。

故障复现代码:

package main

import (
	"bufio"
	"fmt"
	"log"
	"net"
)

func main() {
	conn, err := net.Dial("tcp", "10.1.234.107:55443")
	if err != nil {
		log.Fatalln(err)
	}
	//time.Sleep(time.Millisecond * 5)  // uncommment this line to reproduce the connection issue
	_, _ = fmt.Fprint(conn, "{\"id\": 0, \"method\": \"toggle\", \"params\": [\"smooth\", 300]}\r\n")
	response, _ := bufio.NewReader(conn).ReadString('\n')
	log.Println("response = " + response)
}

这个问题我认为是固件的bug,希望修复。如果您这边认为 by design 的话,我和 python-yeelight 的 owner 去沟通下。

谢谢!

跟社区沟通了一下,社区说这类问题是已知问题了,请问 @_guofeng 您这边有知情吗?

你的问题不是升级不了固件吗?这个只能找个好网络多试几次。加白名单是没用的。

telnet十秒内也是有问题的吗?你的demo里面用的是python-yeelight的库吗?我是Android开发,python看不太明白。

因为telnet是手动输入命令的,所以从 socket API 的 connect() 到 send() 至少会有好几秒的时间差。问题是在于 connect() 到 send() 之间要等待若干毫秒才能正常工作,这个在贵司的 spec 里是不存在的行为。

换言之,如果是通过脚本控制 telnet 发 command,问题也是能复现的。

所以若您能确定这是符合设计预期的行为,而不是固件的bug。我可以给 python-yeelight 去提个 PR。

我demo是golang的代码,没有使用 python-yeelight 的库,是纯 TCP socket 通信,和 telnet 原理是完全相同的。

如您所述,建立 TCP 连接后立即发送 command 就是会出现问题。

而哪怕只要再建立连接后 sleep(10) (睡眠10毫秒),问题就完全消失,并恢复正常。

您要是有需要的话,我可以给你写个 android app 帮助理解和复现问题。

已经反馈给我们的固件老师,周末他会帮忙看看。不过感觉解决问题最快的办法还是Sleep十毫秒。

辛苦。

我之所以提这个问题,是因为灯具在 connect() 后还要 sleep 一段时间才能接受操作这一事实,对一个典型的 TCP server 来说,是一个不合乎常规的行为。这对其他的开发者来说,会产生困惑。

典型的例子正是 python-yeelight 的作者在设计这个lib时,对socket对象使用了懒惰的单例模式。这么做是合理的,且建立在 TCP server 连接后即可立即接受请求的惯例设计的。

除非 spec 上明确定义了这样的行为,否则希望您有时间的话,还是把这个修复。

祝周末快乐。

哈喽 可以申请推送新的固件吗!

是遇到了问题吗?白名单比较紧缺,如果没遇到问题,暂时先等等吧。

感谢您的反馈,问题可以复现,我们正在查找原因

辛苦 :heart:

是的 我需要局域网控制进行HomeAssistant的一些开发 可以申请一下嘛 谢谢啦

已经添加完了,请在两天内升级完成。

有进展吗?

猜测跟这个固件的模组有关系,其它模组平台上,我们未复现类似issue。问题我们也会持续跟进。解决问题可能时间比较长,我建议你还是先delay 10ms先把问题解决了。

1 个赞

@_guofeng any updates?