Skip to content

Commit

Permalink
add: 添加初始化版本
Browse files Browse the repository at this point in the history
  • Loading branch information
wendal committed Jan 2, 2024
1 parent 58901ea commit 0ec7d80
Show file tree
Hide file tree
Showing 5 changed files with 252 additions and 1 deletion.
21 changes: 20 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,21 @@
# luatos-lib-ntrip
ntrip协议客户端

ntrip协议客户端 for LuatOS

## 介绍

本客户端基于socket库, 兼容所有LuatOS平台, 只要该平台实现socket库即可.

## 安装

本协议库使用纯lua编写, 所以不需要编译, 直接将源码拷贝到项目即可

## 使用

1. 请先确认ntrip账户, demo中的账户是演示用户, 通常已经过期
2. 参考demo中的代码, 初始化ntrip客户端, 传入ntrip账户信息
3. 调用ntrip.start()启动客户端

## LIcense

[MIT License](https://opensource.org/licenses/MIT)
48 changes: 48 additions & 0 deletions demo/demo.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@

local demo = {}
ntrip = require("ntrip")

local gnss_uart_id = 1

local function gnss_write(data)
uart.tx(gnss_uart_id, data)
end

sys.taskInit(function()
sys.waitUntil("net_ready")
ntrip.setup({
host = "106.55.71.75",
port = 8002,
user = "zhd556308",
password = "OZ469006",
mount = "/RTCM33_GRC",
cb = gnss_write
})
ntrip.start()
uart.setup(gnss_uart_id, 115200)
uart.on(gnss_uart_id, "recvice", function(id, len)
local s = ""
repeat
s = uart.read(id, len)
if #s > 0 then
log.info("uart", "receive", id, #s, s)
ntrip.write(data)
end
if #s == len then
break
end
until s == ""

end)
--

-- 下面的代码是PC端模拟GPS数据
if rtos.bsp() == "PC" then
while 1 do
sys.wait(2000)
ntrip.gga("$GNGGA,021700.000,2324.4051578,N,11313.8597153,E,1,13,1.291,22.077,M,-6.122,M,,*6D\r\n")
end
end
end)

return demo
32 changes: 32 additions & 0 deletions demo/main.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
--[[
NTRIP协议演示
]]

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "ntripdemo"
VERSION = "1.0.0"

log.info("main", PROJECT, VERSION)

-- 一定要添加sys.lua !!!!
sys = require("sys")
sysplus = require("sysplus")

print(rtos.bsp())


-- 用户代码已开始---------------------------------------------

require "netready"
-- require ("ntrip")
require "demo"

-- 用户代码已结束---------------------------------------------




-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

39 changes: 39 additions & 0 deletions demo/netready.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@


-- 统一联网函数
sys.taskInit(function()
-----------------------------
-- 统一联网函数, 可自行删减
----------------------------
if wlan and wlan.connect then
-- wifi 联网, ESP32系列均支持, 要根据实际情况修改ssid和password!!
local ssid = _G.ssid or "luatos1234"
local password = _G.password or "12341234"
log.info("wifi", ssid, password)
-- TODO 改成自动配网
wlan.init()
wlan.setMode(wlan.STATION) -- 默认也是这个模式,不调用也可以
wlan.connect(ssid, password, 1)
elseif mobile then
-- EC618系列, 如Air780E/Air600E/Air700E
-- mobile.simid(2) -- 自动切换SIM卡, 按需启用
-- 模块默认会自动联网, 无需额外的操作
elseif w5500 then
-- w5500 以太网
w5500.init(spi.HSPI_0, 24000000, pin.PC14, pin.PC01, pin.PC00)
w5500.config() --默认是DHCP模式
w5500.bind(socket.ETH0)
elseif socket then
-- 适配了socket库也OK, 就当1秒联网吧
sys.timerStart(sys.publish, 1000, "IP_READY")
else
-- 其他不认识的bsp, 循环提示一下吧
while 1 do
sys.wait(1000)
log.info("bsp", "本bsp可能未适配网络层, 请查证")
end
end
-- 默认都等到联网成功
sys.waitUntil("IP_READY")
sys.publish("net_ready")
end)
113 changes: 113 additions & 0 deletions lib/ntrip.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@

local ntrip = {}

-- 编写ntrip客户端

local opts = {}

function ntrip.setup(user_opts)
-- if user_opts["host"] == nil then
-- log.error("ntrip", "必须设置host")
-- return
-- end
-- if user_opts["port"] == nil then
-- log.error("ntrip", "必须设置port")
-- return
-- end
-- if user_opts["user"] == nil then
-- log.error("ntrip", "必须设置用户名user")
-- return
-- end
-- if user_opts["password"] == nil then
-- log.error("ntrip", "必须设置密码password")
-- return
-- end
-- if user_opts["mount"] == nil then
-- log.error("ntrip", "必须设置挂载点mount")
-- return
-- end
-- if user_opts["cb"] == nil then
-- log.error("ntrip", "必须设置数据回调cb")
-- return
-- end
opts = user_opts
return true
end

function ntrip.task()

-- 准备好所需要的接收缓冲区
local rxbuff = zbuff.create(1024)
local netc = socket.create(opts.adapter, function(sc, event)
log.info("ntrip", "socket event", sc, event)
-- 收到数据, 或者连接断开
if event == socket.EVENT then
log.info("ntrip", "收到数据EVENT")
while 1 do
local succ, data_len = socket.rx(sc, rxbuff)
log.info("ntrip", "接收", succ, data_len)
if not succ then
ntrip.keep = nil
break
end
if data_len and data_len > 0 then
log.info("ntrip", "接收数据", data_len, rxbuff:query())
if ntrip.cb then
ntrip.cb(rxbuff)
rxbuff.del()
end
else
break
end
end
end
-- 连接成功
if event == socket.ON_LINE then
log.info("ntrip", "连接成功")
-- 写入ntrip协议头
local data = string.format("GET %s HTTP/1.0\r\nUser-Agent: NTRIP NtripClientPOSIX/1.50\r\nAccept: */*\r\n", opts.mount)
data = data .. string.format("Host: %s:%d\r\n", opts.host, opts.port)
data = data .. string.format("Connection: close\r\n")
local auth = string.format("Authorization: Basic %s\r\n\r\n", (opts.user .. ":" .. opts.password):toBase64())
log.info("ntrip", "发送请求头", data .. auth)
if not socket.tx(sc, data .. auth) then
log.error("ntrip", "发送auth失败")
return
end
ntrip.keep = true
end
end)
socket.config(netc, nil)
ntrip.netc = netc
while true do
-- 连接服务器, 15秒超时
log.info("ntrip", "开始连接服务器", opts.host, opts.port)
if socket.connect(netc, opts.host, opts.port) then
sys.wait(3000)
while ntrip.keep do
sys.wait(3000)
end
end
log.info("ntrip", "连接失败")
-- 能到这里, 要么服务器断开连接, 要么上报(tx)失败, 或者是主动退出
socket.close(netc)
-- log.info(rtos.meminfo("sys"))
sys.wait(5000) -- 这是重连时长, 自行调整
end
end


function ntrip.start()
if ntrip.task_id == nil then
ntrip.task_id = sys.taskInit(ntrip.task)
end
end

function ntrip.gga(str)
if ntrip.netc then
-- TODO 仅发送gga数据
socket.tx(ntrip.netc, str)
end
end

return ntrip

0 comments on commit 0ec7d80

Please sign in to comment.