小蚁智能后视镜定位接入HA,实现车辆定位

很早就想把家里的车辆定位接入HA,什么汽车在线万物在线的还得再额外购买新设备,并且车上OBD口被优驾盒子占用了懒得再插别的OBD,车上既然装了智能后视镜,一直想着怎么通过车上的智能后视镜接入HA。最简单的方法是在智能后视镜里安装GPSLOGGER软件,反正都是安卓系统,此方法对绝大多数安卓车机、车镜都可以,顺便推荐给广大车友及坛友。但我的车镜用这个方法有瑕疵,就是容易杀内存杀后台把GPS给杀死,并且由于车镜硬件性能低,偶尔会有堆积GPSLOGGER请求的情况出现。于是另找他法。
前段时间看到论坛dscao大佬通过抓包APP实现优驾盒子接入HA,制作了相应的HA插件,并且跟大佬联系后还帮我做了一个不同版本优驾盒子接入的插件,让我接入了优驾后视镜。
小弟还有另一辆车,装的是小蚁智能后视镜,后视镜里装了优驾,虽然用大佬的插件能获取定位,但是因为是第三方镜子,不是优驾自家镜子,所以在定位数据上传时只能停车熄火才能上传,基本没法实现实时更新定位数据。
后来又转战dscao大佬的高德地图车机版接入HA的插件,顺利在小蚁后视镜里装了5.0版本的高德地图,可以实时更新定位数据,以上这些方法都可以推荐给广大车友及坛友。但我的仍然不太完美,因为后视镜里高德地图无法开机自启动,每次都得手动打开,比较麻烦。所以开始琢磨能不能直接获取小蚁后视镜服务器的定位数据。
——————————————————————————————————————————————————————————————————————————————————————

原理篇
言归正传,开始介绍如何接入小蚁后视镜,前面写这么多,是为了感谢dscao大佬,提供了方法和灵感。我接入小蚁后视镜的原理也是利用手机抓包软件,对小蚁后视镜APP进行抓包,找到定位信息、有经纬度信息的包,然后怎么弄到HA里呢?HA我玩得不熟,更不会写插件了,但是我会node-red啊,我用NR的http节点来模仿刚才抓包的http请求,得到经纬度数据。但问题又来了,怎么弄进HA里去?HA的经纬度需要转化并且附加给person或者device tracker这样的实体,这个我不会。但突然我想到了一个方法,利用官方的GPSLOGGER集成当桥(不用gpslogger的APP,只用他的HA集成),把信息通过GOSLOGGER的集成直接传进HA,这些数据转化并添加实体的工作就利用GPSLOGGER集成来完成。因为我发现GPSLOGGER的原理就是由gpslogger APP将信息以特定的格式通过HTTP协议传给HA的GPSLOGGER集成就行。那么我可以在HR里,把获取到的经纬度信息,模仿gpslogger APP里的http格式发送给HA,然后就能在HA的GPSLOGGER里得到定位实体了。
原理就这么简单,说到这里,很多有能力的人已经明白了,无需往下看了,如果还需详解请往下看。此利用GPSLOGGER当桥的方法适用于任何你可以获取到经纬度信息然后想接入HA的情况。
——————————————————————————————————————————————————————————————————————————————————————

抓包篇
我用的是安卓精灵手机抓包软件,抓小蚁智能后视镜的APP的包,抓包精灵开启监听后进入小蚁APP点击车辆车况查看定位,此时抓包精灵抓到类似这样的包,就成功了。

Request Head:GET /v1/condition/getCarConditionInfo?seq=巴拉巴拉小魔仙 HTTP/1.1Cache-Control: no-cacheHost: mirrorapi.xiaoyi.comConnection: Keep-AliveAccept-Encoding: gzipCookie: SERVERID=巴啦啦能量User-Agent: okhttp/3.4.1Body:Response Head:HTTP/1.1 200 OKDate: Wed, 10 Mar 2021 12:34:13 GMTContent-Type: text/html;charset=UTF-8Content-Length: 254Connection: keep-aliveAccess-Control-Allow-Origin: *Pragma: No-cacheCache-Control: no-cacheExpires: Thu, 01 Jan 1970 00:00:00 GMTSet-Cookie: SERVERID=巴啦啦能量ath=/Body:{ “data”:{ “distance”:"-1", “gpsTime”:“1615368508134”, “speed”:“7.06”, “avgConsumption”:"-1", “voltage”:"-1", “consumption”:"-1", “totalDistance”:"-1", “leftOil”:"-1", “rtTime”:"-1", “longitude”:“116.62385”, “latitude”:“40.131836”, “temperature”:"-1" }, “code”:“20000”}

上面有中文的地方,是我替换了我自己的信息,这些信息应该就是跟你的设备信息有关,用来向服务器发送请求时识别用的。注意到上面信息里已经有经纬度信息了。后面的工作就交给NR了。
——————————————————————————————————————————————————————————————————————————————————————————————

NR篇
用NR的http节点,模仿刚才抓包得到的http请求包,去小蚁服务器上获取定位信息,在NR里把经纬度信息分离出来,按照GPSLOGGER APP的http格式,传进HA。不多说了,直接把我的代码附上。记得把里面的中文全部替换成你刚才抓包得到的关于你自己的配置。

[{"id":"a1dd0a4d.e1e038","type":"tab","label":"流程 2","disabled":false,"info":""},{"id":"34a07850.0a2e08","type":"http request","z":"a1dd0a4d.e1e038","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://mirrorapi.xiaoyi.com/v1/condition/getCarConditionInfo?seq=巴拉巴拉小魔仙","tls":"","persist":true,"proxy":"","authType":"","x":320,"y":200,"wires":[["d1c0dcff.09e2d"]]},{"id":"9a0d221f.46283","type":"inject","z":"a1dd0a4d.e1e038","name":"30秒一次","props":[{"p":"Cookie","v":"SERVERID=巴啦啦能量","vt":"str"}],"repeat":"30","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":110,"y":200,"wires":[["34a07850.0a2e08"]]},{"id":"d1c0dcff.09e2d","type":"change","z":"a1dd0a4d.e1e038","name":"提取经纬度","rules":[{"t":"move","p":"payload.data.longitude","pt":"msg","to":"lon","tot":"msg"},{"t":"move","p":"payload.data.latitude","pt":"msg","to":"lat","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":530,"y":200,"wires":[["f1c08774.28f7f8"]]},{"id":"f1c08774.28f7f8","type":"function","z":"a1dd0a4d.e1e038","name":"构造GPS LOGGER格式","func":"const device = '你想给你的实体起的名字'\nconst lat = msg.lat\nconst lon = msg.lon\n\nmsg.url='你的HA的地址:8123/api/webhook/你的gpslogger集成的webhook';\nmsg.headers={\n    'Content-Type':'application/x-www-form-urlencoded',\n}\nmsg.payload=`latitude=${lat}&longitude=${lon}&device=${device}&accuracy=0&battery=100`;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":770,"y":200,"wires":[["9249bb65.0197e8"]]},{"id":"9249bb65.0197e8","type":"http request","z":"a1dd0a4d.e1e038","name":"","method":"POST","ret":"txt","paytoqs":"body","url":"","tls":"","persist":false,"proxy":"","authType":"","x":980,"y":200,"wires":[[]]}]

——————————————————————————————————————————————————————————————————————————————————————

GPSLOGGER篇
既然我没用GPSLOGGER集成当桥,你当然肯定得在HA里安装GPSLOGGER的集成喽(我是真怕我不这么写,会有小白不明白,既然已经看到这里了,不免会有些小白)。至于GPSLOGGER集成怎么用,我就不扫盲了,无论是论坛,还是HA官方文档,都写的很清楚了。这里只讲原理,GPSLOGGER的app会把经纬度信息通过这样的http请求发送给你家的HA,

latitude=%LAT&longitude=%LON&device=%SER&accuracy=%ACC&battery=%BATT&speed=%SPD&direction=%DIR&altitude=%ALT&provider=%PROV&activity=%ACT

这里的%LAT、%LON就是读取你手机的经纬度信息,而我们现在不用装手机APP,我们刚才在NR里做的事情就是经这两个用前面获取到的经纬度通过变量替换进去。另外再制定个设备名称作为实体ID,其他的参数其实都可以不写。

之前在HA论坛经过坛友提示,完全可以不用gpslogger当桥。HA本身自带的device_tracker.see的service,可以做到直接生成一个定位实体。

有经纬度数据msg.payload了 怎么生成一个可用用的定位的实体?

就用HA自带的device_tracker.see的service就可以直接生成了啊。

经纬度是变化的 这样不行吧 怎么把变动的msg.payload李经纬度用这个drive.tracker.see显示出一个实体啊。我现在是配置yaml文件才行,还得nr转化下jons格式才行

device_tracker本来不就是追踪设备位置的吗?经纬度当然要变化才叫追踪啊。你其他device_tracker设备经纬度难道不变化吗?不变化你追踪个啥?
具体方法就是把我这个流的后面输出到HA的部分,由利用gpslogger改成利用device_tracker.see的service,原理就是NR每个一定时间把新的GPS坐标数据传给device_tracker.see的service,这样会生成一个device_tracker的实体并不断改变其经纬度数据。
这么说明白了吧?我实在想不出还能怎么更深入更展开地解释了。
并且我觉得你应该实践一下,拉一个call service节点,按照device_tracker.see这个service的格式写法写一下看看,而不是在这瞎猜。具体device_tracker.see的service也去看看官方文档,看了文档你就全明白了,就不用在这猜来猜去了。

明白了,还得nr,之前误解了以为直接ha,