『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 1664|回复: 22

[技术探讨] 新坑:air780eg定位器diy

[复制链接]

56

主题

316

帖子

5175

积分

元老级技术达人

积分
5175
金钱
4849
HASS币
80
发表于 2024-10-24 03:59:23 | 显示全部楼层 |阅读模式
本帖最后由 ryanh7 于 2024-11-29 03:00 编辑

电动自行车的定位器之前发掘过2款了,都是十几块的款。2款都是在原硬件的基础上重新编写固件,以支持gt06接入traccar。买过的两款优点都是价格便宜,该有的硬件都有,缺点是芯片资料稀缺,二次开发成本比较大,而且供货不稳定。其中第2款编写了主要的功能接入了traccar。但是后来感觉硬件不太稳定,有莫名其妙需要重新刷固件的情况。所以有了开发第三款定位器固件的想法。根据之前的经验,觉得新的方案要有几个特点:1,芯片供货量大,容易买到;2,sdk成熟并且公开,3,能支持4g和ipv6。于是留意到合宙的air780eg这个模组
air780eg
1, 支持4g网络(只测试过中国移动的)
2, sdk比较开放,提供了lua脚本编写的sdk,体验下来确实减少了很多开发者需要关系的细节(很多简单繁琐的底层不用写c实现,虽然不大信任脚本语言,但是考虑到大大提高了开发效率还是可以的)
3, 内置gps(这里有个坑,23年以前的出货版本没法在维持gps供电的情况下让cpu睡眠,功耗没法做到极致。不过考虑到开车时的耗电量比定位器工作耗电大多了,也不是不能忽略,大不了车不动的时候就让芯片睡死过去)
4, 可以扫描wifi(这是个大大的优点也是个大大的坑,优点是可以使用wifi定位,有望解决gps定位在不动的时候飘得离谱得问题,缺点是这个wifi扫描功能用的是连接基站的相关芯片,在tcp处于连接状态时无法扫描wifi,废了大半)
5, 这个芯片目前还是比较容易买到的

于是搜着搜着,我发现某宝有家银尔达公司出了一个电动自行车版本的基于air780eg的定位器,价格也公道
YED-GNSS1.jpg

于是买了一个用于验证开发,到手后发现还给了一张用于测试的物联卡(有坑的地方是这张卡无法分配ipv6,在网上另外买的一张物联卡就可以)。
YED-GNSS1资源.jpg



店家给了文档,罗列了一些外部原件的引脚信息,这点就比买其他成品商品进行逆向好,至少引脚不用花时间猜了。实际打开之后发现还是有一些离谱的地方
1, 用于刷机的usb引脚测试点做得很小,对于不常用电烙铁的人不太友好,虽然明明采用的外壳上都留了usb的开口,直接做个usb的焊盘哪怕是让我自己吹一个usb口上去都挺好,实在不行做大点触点也好啊
2, 没有几乎标配的加速度传感器,无法检测翻车状态,也没法做碰撞(不过碰撞这个不好做,一个是要调教算法,另一个是要考虑功耗,cpu睡眠的时候这个传感器就没法用了,除非加芯片),不过给了震动电阻(这点挺好的,实测下来电阻很灵敏,轻轻碰一下都能反应),震动电阻可用于定位器休眠的时候唤醒(以前研究其他成品商品时我就觉得该有这个电阻,可能是因为引脚不明没在其他商品上测出来),应该说做震动报警什么的也可以
3, 没有电池,不能做断电报警,不过这个可以原谅,毕竟成本和售价摆在这。
4, 这个外壳换sim卡不好换,可能设计上就没打算换,毕竟是给开发商用的
5, 有一路输入(检测电动车钥匙开没开),一路输出继电器,但是这个输出的设计好像有点离谱,好像是拉流,继电器还得单独供电?

经过几天痛苦的加班开发研制,验证了几个功能:
1, 联网正常,sim卡支持并且当地网络支持的话可以获得ipv6,和traccar通讯也正常
2, 基本实现了gt06,sdk提供的lua库还是比较丰富的,写起来也比较舒服(补充一句,调试工具也挺好用的),虽然感觉合宙的社区还没做起来,但是路子是对的
3, 可以正常休眠和轻碰唤醒
4, 定位基本正常,验证了agnss(还是官方demo的功劳),定位速度也基本在10秒内。但还是和之前开发过的定位器一样,定位器长时间不动的时候飘得厉害(大多在20米内飘,离谱的时候二三百米地飘),这个应该是和gps的原理有关,高楼的多径效应让定位器“产生了幻觉”。考虑结合震动传感器和wifi判断,长时间不动的时候就不上传定位了,或者结合wifi定位(这个要在服务端做,LBS数据库不好整,考虑做自学习)

有几个还在做的想法
1, 去掉traccar,直接在home assistant写插件接收定位,这样比较好做定位器的远程设置功能(改traccar太繁琐了,不合并到上游还要时不时解决更新的问题),不过缺点的话,ha上的历史轨迹这些就要自己做了(之前正愁写的百度高德无偏地图能有什么用)
2, 抛弃gt06重新设计基于udp的协议,这样可能可以在上传定位的间隔里扫描wifi(不确定,但是官方demo看着像udp和wifi扫描能共存),反正重新设计协议了就可以更好地和第一条结合。吐槽一下gt06的协议设计还是有点问题
3, 验证好这个平台以后,可以做OBD车载设备和直接把air780g集成到电动车仪表盘的版本,电动车版本的也可以改进(加加速度传感器和usb刷机口,电池),同一套程序不用大改(通讯协议的设计难度又上升了,还要考虑扩展性,obd设备有行车数据,电池还有电池信息和告警)
4, 在ha侧做开发,可以远程修改参数(上报间隔,报警功能什么的),基于定位信息做一些实体和功能,还有做lbs和历史轨迹什么的(麻烦啊,看心情吧)


一些备忘信息:
lua开发文档 https://wiki.luatos.com/api
固件地址 LuatOS 发行版 - Gitee.com
demo https://gitee.com/openLuat/LuatOS.git

-----
慢慢更

好消息是经过测试确实是wifi扫描和udp通信可以共存,坏消息是思来想去tcp还是比udp更合适一些,用udp的话还是得想办法实现tcp就有的一些会话特性。

29日:新进度是初步拟定了一个比较灵活的协议,还在慢慢补充细节。已经根据新协议基本跑通了流程,验证了wifi和udp可以共存。基本功能还差定位器的配置项同步流程。然后再完善一下细节,测试和代码安全审查。这样就算基本完成了定位器的功能,写ha插件就要轻松得多了。

31日:1、优化定位发送逻辑:正常情况下发送卫星定位,慢速的时候发送wifi信息辅助定位,开机没有定位信号及定位信号中途丢失的时候发送wifi信息和基站信息辅助定位 2、优化agnss辅助定位逻辑,缓存4小时内的星历,以减少流量消耗。实测在冷启动的情况下,辅助定位可以将卫星首次定位时间从几分钟减少到十几秒。3、指示灯可用,震动检测及唤醒可用,卫星定位及辅助定位可用,wifi扫描可用,基站扫描可用,ipv6可用,休眠功能可用。待完成:远程设置功能,钥匙检测及继电器控制逻辑。

17日:插件写得七七八八了。之前用wifi和基站定位都需要使用第三方数据库,需要收费不说,还有可能数据库不全或者更新不及时,特别是像wifi定位的这种数据库。这次想到可以自建数据库,让定位器在路上跑的时候就顺便采集wifi和基站数据。这部分逻辑写成代码之后感觉是可行的,具体还需要写完之后上路实测一下。可能需要根据具体效果优化定位算法和定位器的上报逻辑。

19日:增加了一些插件细节。还需要打磨
配置.png


21日:其实要考虑的细节挺多的。这两天在一个字节一个比特地优化协议节省流量。尽量控制在30m/月以下。前提是不进行ota,ota要消耗一些流量。硬件层要考虑的有够不够稳定,脚本是不是有没测到的bug,业务逻辑和功能齐不齐全,代码清不清晰,不同网络网络下使用什么发送策略,ota失败怎么办,更新后循环重启怎么办。协议层要考虑字段是不是合理,通用性和效率怎么取舍,节省流量和实时性怎么取舍,向后兼容和扩展性怎么平衡,会话逻辑要考虑网络干扰等意外情况。ha插件侧除了要实现基本功能,重载重启各方面没有bug,还要尽可能优化性能和细节体验,想方设法实现远程配置功能(设备不在线时怎么办),ota怎么更新,wifi和gps融合定位的逻辑和算法怎么设计。相关代码还要简洁,还要进行合理抽象和重构,有必要的文档。算下来确实挺花时间。
这个插件叫U27,为啥叫U27呢其实是拍脑袋想的,因为协议是UDP,写第一行代码的那天是27日 : )
29日:插件侧新增远程配置(未完成)
2024-11-29.png



评分

参与人数 6金钱 +72 收起 理由
Hermit + 10 论坛有你更精彩!
summ99111 + 8 高手,这是高手!
nuknoop + 16 高手,这是高手!
sorrypqa + 16 大神666!
jjcs + 12 高手,这是高手!
yybl + 10 论坛有你更精彩!

查看全部评分

回复

使用道具 举报

15

主题

466

帖子

2477

积分

金牌会员

Rank: 6Rank: 6

积分
2477
金钱
2011
HASS币
0
发表于 2024-10-24 09:03:34 | 显示全部楼层
大佬牛批,现在途强EV49,traccar感觉还可以
回复

使用道具 举报

13

主题

624

帖子

3229

积分

论坛元老

HomeAssistant

Rank: 8Rank: 8

积分
3229
金钱
2600
HASS币
20
发表于 2024-10-24 10:03:43 | 显示全部楼层
大佬牛批,持续关注
回复

使用道具 举报

7

主题

188

帖子

2357

积分

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2169
HASS币
0
发表于 2024-10-24 10:15:04 | 显示全部楼层
支持,万物在线节点废了后,弄了2个银尔达的780模块替代,通过MQTT上传数据,目前有两个问题,一是静止状态位置飘的有点大,二是从地下车库出来后,定位很慢,有时7、8分钟定不上。期待大神的成果
回复

使用道具 举报

56

主题

316

帖子

5175

积分

元老级技术达人

积分
5175
金钱
4849
HASS币
80
 楼主| 发表于 2024-10-24 10:35:54 | 显示全部楼层
xlsj519 发表于 2024-10-24 10:15
支持,万物在线节点废了后,弄了2个银尔达的780模块替代,通过MQTT上传数据,目前有两个问题,一是静止状态 ...

静止位置是会漂,空旷地方定位慢可能是agnss 网络辅助定位没开
回复

使用道具 举报

7

主题

188

帖子

2357

积分

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2169
HASS币
0
发表于 2024-10-24 11:08:49 | 显示全部楼层
本帖最后由 xlsj519 于 2024-10-29 11:29 编辑
function 
        --系统等待15s
        sys.wait(15000) 
        --相关变量赋值
        local taskname="userTask" 
        log.info(taskname,"start")
        --赋值nid网络通道序号,后面获取网络通道状态api PronetGetNetSta(id)用
        local nid=1
        --赋值uid,后面没用到?
        local uid=1
        --将获取网络通道状态返回值赋予netsta
        local netsta =0
        --需要上传数据信息时,needup变为1
        local needup =1
        --计数器,用来计算发送数据间隔,每秒加1
        local count =0
        local count2 =0
        --local lastlnglat = 0
        --初始化GPS
        GpsInit()
        --执行AGNSS辅助定位,下载星历成功返回1
        GpsExecAgnss()
        --执纪一个while循环,因为直接检测true的值,所以一直循环
        while true do
        --声明局部变量d为一个表          
                local d ={}
                --获取系统日期,并赋值给d.datetime
                d.datetime=os.date("%Y-%m-%d %H:%M:%S")
                --获取sim卡信号强度
                d.xinhao=mobile.csq()
                --获取sim卡imei
                d.imei=mobile.imei()
                --获取sim卡用户识别码(ICCID)
                d.iccid = PerGetIccid()
                --获取外部供电电压,通道为1
                d.adc = PerGetAdcGatherValByAdcId(1)
                --获取外部高低电平输入端状态
                d.input=PerGetDiById(1)
                --获取GPS震动情况
                d.shake=PerGetGpsZdSta()
                --赋值d.gps为空表
                d.gps={}
                --用libgnss.isfix获取gps是否定位成功并赋值给d.gps.isFix
                d.gps.isFix=libgnss.isFix()
                --如果gps定位成功,则通过libgnss.getRmc(2)api获取相关数据并赋值给d.gps
                if libgnss.isFix() then 
                        local tg =libgnss.getRmc(2)
                        d.gps.lat=tg.lat
                        d.gps.lng=tg.lng
                        --gps返回速度为海里(节),转换为公里
                        d.gps.speed=tg.speed * 1.85
                        --variation地面航向,单位度,从正北顺时针算;year\moth\day\hour\min\sec时间
                        --local lnglat = tg.lng + tg.lat
                        --local deltalnglat = math.abs(lnglat - lastlnglat)
                        --lastlnglat = lnglat
                end
                --将Lua的数据结构(如表、数组、字符串、数字等)转换为 JSON 格式的字符串并赋值给updata
                local updata = json.encode(d)
                --获取网络通道状态,并赋值给netsta
                local netsta = PronetGetNetSta(nid)
                log.info(taskname,"updata",updata,"netsta",netsta)
                --如果needup为1,且updata不为空,网络通道状态正常,就调用网络通道发送数据PronetSetSendCh(id,s)上报数据,并将needup和count归零
                if needup ==1 and updata and netsta ==1 then 
                        needup =0
                        count =0
                        PronetSetSendCh(nid,updata)
                end
                --计数器加1
                count = count+1
                count2 = count2+1
                -- CX4 电压大于13700,A4L 电压大于13500视为车辆启动,10秒将needup设为1,上传一次数据
                if PerGetAdcGatherValByAdcId(1) > 13700 and count > 10 then
                        needup =1
                        count =0
                end
                --如果电压高于13.7视为车辆启动,且gps未获取成功,每300秒GpsExecAgnss获取下辅助定位数据
                if PerGetAdcGatherValByAdcId(1) > 13700 and libgnss.isFix() == false  and count2 > 300 then
                        GpsExecAgnss()
                        count2 =0
                end
                --平常600秒上传次数据
                if count > 600 then 
                        needup =1
                        count =0
                end 
                sys.wait(1000)
        end 
end
使用任务模块加了电压检测和定时上报数据
回复

使用道具 举报

7

主题

188

帖子

2357

积分

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2169
HASS币
0
发表于 2024-10-24 11:17:30 | 显示全部楼层
ryanh7 发表于 2024-10-24 10:35
静止位置是会漂,空旷地方定位慢可能是agnss 网络辅助定位没开

不会重写固件,原来的DTu固件下,请教下如何打开agnss功能
回复

使用道具 举报

49

主题

1718

帖子

6896

积分

论坛元老

Rank: 8Rank: 8

积分
6896
金钱
5168
HASS币
40
发表于 2024-10-24 11:23:59 | 显示全部楼层
折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

56

主题

316

帖子

5175

积分

元老级技术达人

积分
5175
金钱
4849
HASS币
80
 楼主| 发表于 2024-10-24 11:32:47 | 显示全部楼层
GpsExecAgnss这个函数就是,想办法在失去定位后2到4个小时后重新执行就可以了(比如离开地库的时候)
回复

使用道具 举报

49

主题

1718

帖子

6896

积分

论坛元老

Rank: 8Rank: 8

积分
6896
金钱
5168
HASS币
40
发表于 2024-10-24 11:33:01 | 显示全部楼层
本帖最后由 jjcs 于 2024-10-24 11:34 编辑

还是别用traccar,用mqtt,第三方的云,方便稳定,毕竟云平台比自己搭的稳
折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2025-1-4 16:18 , Processed in 0.073019 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表