使用Air724UG模块拍摄照片并上传至云服务器

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

前言

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

Air724UG

Air724UG

基础知识

如果买了这个模块,首先把卖家写的五篇开发文档看一下,如下

最重要的是最后一个文档,因为我们后面要修改这里面的代码。

看完文档后,应该就会对 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 模块STM32 之间通信的实现 #### 1. 硬件连接 为了使 Air724UG 模块能够与 STM32 进行有效通信,硬件连接至关重要。通常情况下,Air724UGSTM32 的 UART 接口用于串行通信。具体接线如下: - TXD (Air724UG) -> RXD (STM32) - RXD (Air724UG) -> TXD (STM32) - GND (Air724UG) -> GND (STM32) 确保电源供应稳定,按照模块手册中的建议设置合适的电平转换电路。 #### 2. 初始化配置 在软件层面初始化时,需先配置好 UART 参数以匹配 Air724UG 默认波特率(通常是 115200 bps)。接着可以发送 AT 命令来查询确认模块的工作状态和版本信息[^1]。 ```c // 配置USART参数 UART_HandleTypeDef huart; huart.Instance = USARTx; // 替换为实际使用的USART端口号 huart.Init.BaudRate = 115200; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; HAL_UART_Init(&huart); ``` #### 3. 发送 AT 命令 通过 UART 向 Air724UG 发送标准 AT 命令来进行各种操作,比如获取模块基本信息、检查网络注册情况等。下面是一个简单的例子展示了如何向模块发出指令读取响应: ```c void send_at_command(char* cmd){ HAL_UART_Transmit(&huart, (uint8_t*)cmd, strlen(cmd), HAL_MAX_DELAY); } char buffer[64]; if(HAL_UART_Receive(&huart, (uint8_t *)buffer, sizeof(buffer)-1, 1000)== HAL_OK){ buffer[sizeof(buffer)-1]='\0'; } send_at_command("AT\r\n"); // 测试链路是否正常 ``` #### 4. 数据传输协议 当涉及到更复杂的应用场景如 MQTT 协议下的消息传递时,则可能需要用到特定库函数处理来自服务器的消息反馈。例如,在接收到云端下发的数据包之后将其转交给 `intmqtt_connect_ack` 函数进一步解析处理[^3]. ```c extern void intmqtt_connect_ack(unsigned char *buff); // 处理从Air724UG接收的数据 while (true) { if (data_available()) { // 自定义函数判断是否有新数据到达 unsigned char data_buffer[256]; read_data(data_buffer); // 将数据读入缓冲区 intmqtt_connect_ack(data_buffer); // 调用回调函数处理数据 } } ``` #### 5. 功能测试 完成上述步骤后就可以编写完整的应用程序逻辑了。系统启动后应该自动执行必要的初始化动作,随后进入循环等待事件触发或定时任务调度[^2].
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Apple_Coco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值