背景
省流:安装 bonjour
最近使用esp8266制作mqtt串口中转,将单片机数据通过本地emqx服务器上传到自己用C#制作的上位机,以达到AD数据可视化曲线。开始使用的是SDK中MQTT模板,通讯正常,只是需要输入IP地址才行,输入主机名是无法连接!而当emqx服务器电脑重启后路由将会重新分配IP,因此,就得重新更改esp8266内ip地址,然后重新烧录,这样实在太麻烦且不够优雅。通过研究发现可以使用mDNS组播方式实现局域网内主机域名解析。
问题点
开始不知道mDNS的时候,默认使用的是DNS,测试解析www.baidu.com等网站的时候是正常解析出IP地址,一旦解析本机电脑名时是失败!经了解才重新学习DNS域名解析知识,也才知道本地需要使用mDNS。不过不知道为什么PC端C#能直接解析?还以为都一样!
将乐鑫提供的mDNS例程烧录时发现还是无法解析主机.local,经过多次测试和网络查询才发现问题所在!本来都要放弃使用mDNS,那种感觉就像是当初搭建ESP开发环境一样,毕竟一直失败也是信心大减!好在最后使出大方法,就是用ping 主机名 试试看,发现不带local结尾的都能ping通过,一旦带结尾它也给自动去掉!而手里的ESP8266设置主机名后,ping 主机名.local 是能通过的啊,这就说明是windows 主机的mDNS服务器未开启,找到问题后就好解决了!
解决办法
特别简单,就是将windows的mDNS服务安装启动就行了啊!去网上找到 bonjour 软件安装即可,然后重新ping 主机名.local 就OK收工了!之后esp芯片也能正常解析出IP地址,解析出来的是int类型,使用 inet_ntoa 网络转换成字符串函数填入mqtt设置配置就行!
总结
其实问题是很简单,主要还是因为不了解DNS和mDNS原理导致。很多时候,问题的解决方案往往就在身边,做技术多了就更深有体会,虽然答案在身边,但却得找一圈,等你快放弃的时候突然就柳暗花明,忍不住来一句:“卧槽”。但解决的过程真的是心流的体会,忘记了时间存在!之前安装ESP开发环境也是如此,总在准备放弃的时候,心里想着再试试看,就真解决了!
还有个小问题,网上说win10是自带mDNS,只有winxp-win8没有,我一台win10是因为安装过苹果ITuns驱动,所以直接就可用,不知道是不是因为这原因。大家有直接win10测试的麻烦告知一下哈!