文章目录
前言
最近在做物联网的项目,有一个需求是要每隔一段时间要拍摄一张现场的图片并上传至云服务器保存。在查阅了很多资料后,发现这方面的资料是真的匮乏。同时,tb 上的摄像头产品也太高度集成了,很难进行二次开发。一次机缘巧合下,在逛 tb 的时候偶然发现一款产品,就是如下图所示 Air724UG 模块,自带 4G 通信模块和摄像头接口,而且成本也比较便宜,带通信卡和摄像头总价格不超过 80,简直就是完美符合我需求的天选产品。同时该系列产品的官方网站上也给出了很多代码 demo,非常有利于初学者的学习。最终,在经历了几天的学习后,终于成功把这个需求实现了,开心ヾ(•ω•`)o,于是在此记录下来,希望能帮助到其他有需要的小伙伴们~


基础知识
如果买了这个模块,首先把卖家写的五篇开发文档看一下,如下
- 1-Air724UG(4G全网通GPRS)开发-硬件使用说明
- 2-Air724UG(4G全网通GPRS)开发-下载AT指令固件
- 200-Air724UG(4G全网通GPRS)开发-下载和运行第一个lua程序
- 201-Air724UG模块(4G全网通GPRS开发)-模块测试-测试SD卡和扬声器(喇叭)播放功能
- 202-Air724UG模块(4G全网通GPRS开发)-模块测试-摄像头扫码,LCD显示摄像头图像
最重要的是最后一个文档,因为我们后面要修改这里面的代码。
看完文档后,应该就会对 Air724UG 模块有了大致的了解,同时我们也会发觉二次开发是基于 Lua 语言的。有小伙伴可能就会问,没学过 Lua 语言肿么办
莫慌,因为合宙官方给出了很多案例的示例代码,包括上面第五个文档里面用的摄像头案例的代码。我们可以打开代码看一下,官方的代码规范写的很好,每一句代码几乎都有注释,这就非常有利于我们初学者的学习~
博主也是在大致浏览了下代码后,尝试性的将 socket 的示例代码和 camera 的示例代码融合起来,成功的解决了这个需求,下面就具体看看修改后的代码吧~
编写 TCP 客户端代码
目前拍摄的需求已经通过默认的 camera 示例代码实现了,下面要实现的就是如何把照片上传到云端。搞过开发的同学应该都大致了解 socket 这个东西,我们各种网络通信的基础就是 socket,我们用 socket 也可以很快搭建一个 tcp 服务器,这样就相当于我们的摄像头模块是 tcp 客户端,部署了代码的云服务器是 tcp 服务器端,两端连通以后,就可以实现将照片传输到云端啦~
下面先看一下 TCP 客户端具体代码
主要用到的就是官方 demo\socket\async\asyncSocket 的案例和 demo\camera 这两个案例,我们按照 socket 案例的 main 文件修改 camera 案例的 main 文件,修改后如下
--必须在这个位置定义PROJECT和VERSION变量
--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
PROJECT = "CAMERA"
VERSION = "2.0.0"
--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
--[[
如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
]]
--log.openTrace(true,1,115200)
require "sys"
require "utils"
require "patch"
require "pins"
require "net"
--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
-- net.startQueryAll(60000, 60000)
--8秒后查询第一次csq
net.startQueryAll(8 * 1000, 60 * 1000)
--此处关闭RNDIS网卡功能
--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
ril.request("AT+RNDISCALL=0,1")
--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
--此功能模块不是必须的,根据项目需求决定是否加载
--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
--使用说明参考demo/console下的《console功能使用说明.docx》
--require "console"
--console.setup(1, 115200)
--加载硬件看门狗功能模块
--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
--[[
require "wdt"
wdt.setup(pio.P0_30, pio.P0_31)
]]
--加载网络指示灯和LTE指示灯功能模块
--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
require "netLed"
pmd.ldoset(2,pmd.LDO_VLCD)
netLed.setup(true,pio.P0_1,pio.P0_4)
--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
--加载错误日志管理功能模块【强烈建议打开此功能】
--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
require "errDump"
errDump.request("udp://ota.airm2m.com:9072")
--加载远程升级功能模块【强烈建议打开此功能】
--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
--require "update"
--update.request()
require"color_lcd_spi_st7735"
--require"color_lcd_spi_gc9106l"
require"testCamera"
-- 系统工具
require "misc"
require "testSocket"
require "ntp"
ntp.timeSync(1,function()log.info(

本文档记录了使用Air724UG 4G模块结合Lua语言,通过TCP协议将摄像头拍摄的照片上传至云服务器的过程。首先介绍了模块的基本知识和所需文档,然后详细展示了如何修改Lua代码实现TCP客户端功能,最后提供了Go语言编写的TCP服务器端代码示例,实现了照片的接收和保存。
最低0.47元/天 解锁文章
7104

被折叠的 条评论
为什么被折叠?



