文章目录
前言
物联网技术日渐热门,万物互联的时代已经到来,我们有必要学习并使用物联网的开发模组,来适应科学技术日新月异的今天,也为日后的工作提供便利
提示:以下是本篇文章正文内容,下面案例可供参考
一、Air724UG是什么?
Air724UG是支持4G通讯的LGA封装芯片,可进行4G LTE通讯。相当于路由器中的芯片,我们把它焊接到pcb上,提供电源和SIM卡,就可以通过指令与网络通讯。
二、AT是什么?
AT指令是应用于终端设备与PC应用之间的连接与通信的指令。AT 即Attention。每个AT命令行中只能包含一条AT指令;对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度(包括最后的空字符)。
每个AT命令行中只能包含一条AT指令;对于由终端设备主动向PC端报告的URC指示或者response响应,也要求一行最多有一个,不允许上报的一行中有多条指示或者响应。AT指令以回车作为结尾,响应或上报以回车换行为结尾。 AT指令在通讯中的作用与意类似Windowns中的DOS,Windows基于DOS建立UI实现可视化操作,我们只看到Windows中的操作,却看不到每一个动作之后隐藏的无数条指令。
AT是用于通讯的指令,常用于通讯模块与控制端之间的通讯,例如多年前的无线网卡。随着通讯技术的发展与通讯协议的迭代,AT在PC与手机上的应用日渐减少。目前的 AT 指令着重应用在4G模块、WiFi 模块、BLE 模块中,目的是为了简化嵌入式设备联网的复杂度。 本模块AT指令参照:https://www.openluat.com/Product/file/asr1802/Luat%204G%E6%A8%A1%E5%9D%97AT%E5%91%BD%E4%BB%A4%E6%89%8B%E5%86%8CV4.1.6.pdf 进行编写
三、服务器是什么?
服务器的具体定义过于晦涩,在本教程中,服务器是指能供远程访问与控制,数据操作与处理的计算机。一般拥有固定的公网IP地址,现多使用云服务器代替自建服务器,例如“阿里云,腾讯云,华为云”等,本教程中使用的是华为云搭建的服务器=来进行演示
四、我们要做什么?
- 要让Air724UG能通过人工操作建立与服务器的通信
- 要让服务器能收集存储AIr724UG发送的信息
- 要让Air724UG能在程序引导下,自动向服务器发送数据
- 要让Air724UG能在集成了信息收集系统的开发板的引导下,自动向服务器发送收集到的数据**
五、我们该怎么做?
0.准备工作
1、Air724UG开发板+MicroUSB线、SIM卡(老式安卓线)
2、51单片机(51为例,也可以用STM32或其他开发板)
3、QCOM串口通讯助手
下载地址:https://yzui.xyz/yiban/QCOM_V1.6.exe
用于与开发板进行AT通讯
4、Keil C51单片机编程软件
用于编写单片机程序
5、Pycharm(服务器用)
Python编译器(本TCP端口使用Python写成,Java与C#都能实现TCP监听,请大家自行尝试)
6、MobaXterm(服务器用)
连接服务器使用
7、云服务器(服务器用)
以华为云为例,用于建立TCP通讯及收集数据
1·连接模块
1、下载并安装驱动
合宙官方资源也地址:https://www.openluat.com/Product/4g/S724.html
驱动地址:https://www.openluat.com/Product/file/uis8910dm/sw_file_20200303181718_8910_module_usb_driver_signed%20_20200303_hezhou.7z
LuaTools地址:http://www.openluat.com/Product/file/luatoolsV2-redirect.html
下载后得到7z压缩包
找到并解压该文件
根据不同的系统版本,安装不同的驱动程序
进入文件夹后根据电脑CPU位数选择安装程序(新电脑一般为64位)
右击选择“以管理员身份运行”
一直点击下一页直到出现下图
点击完成
至此驱动安装成功
2、下载Luatools工具
LuaTools地址:http://www.openluat.com/Product/file/luatoolsV2-redirect.html
下载时如弹出下图窗口,点击右侧三点后点击保留
Luatools是单文件软件,但运行会产生Log,建议将其从下载文件夹复制到单独的文件夹中使用
如出现提示,点击红圈。如遇更新,则根据个人喜好更新,更新会产生其他的文件夹,建议在单独目录下操作。
成功打开之后的LuaTools
至此LuaTools安装成功
3、连接4G模块
将不插卡的Air724UG(不插卡是为了防止由于使用的模块本来就有故障,而导致机卡绑定的SIM卡失效)用线连接好,与电脑的USB口连接,检查第二列红色LED灯是否常亮,其他LED是否熄灭(如有灯闪烁或常量请检查接线与SIM卡,如无问题请排查硬件问题)
检查无误后,打开LuaTools,主要这三项内容
- COM口的下拉菜单中是否有3项内容(AT,AP,Modem)如是请进行下一项
- 勾选4G模块(USB打印)前的对勾,并点击重启模块,看是否有信息输出
- 如不是,则右击“开始”(左下方四个小方块的图标)选择设备管理器
打开设备管理器,如有COM口,且为包括AP,AT,Modem,则重启电脑或重装LuaTools。如仍不能解决问题,多是硬件故障,及时更换开发板。
如有输出,则正常(如下图所示)
输出正常后,进入下一步
2.检查固件
注意查看固件版本的结尾字符是否为“AT”,如是,请进行第三步,如不是,请按下边的步骤操作
固件相关——4G Cat.1)—— XXXX切换为AT版本
点击后出现下图,点击“下载”(如无问题,固件下载过程是全自动的,如出现问题,建议考虑硬件故障)
完成后重复步骤一、二,无误后进入步骤三
3.联网测试
1、QCOM串口调试助手
地址:https://yzui.xyz/yiban/QCOM_V1.6.exe(其他途径下载的也行)
与LuaTools一样,都是单文件程序,建议放到独立文件夹中。界面如下
左上是连接端口的区域,在配置正确的情况下,能全自动识别,直接点击Open Port即可完成与模块的连接
左下是命令发送区,在框中输入指令后,调节上方设置,发送指令给模块
右侧是指令队列设置,上边的框是指令,下边是指令序列的相关设置
当一切就绪后,右击“开始”(左下方四个小方块的图标)选择设备管理器
确定COM口后回到QCOM
在左上的COM选择框口中选择AT所对应的COM口,第二个框波特率设置为115200,其他设置不动
点击OpenPort,观察左下的信息框中的状态,成功则提示Success
此时已与模块建立了AT的通讯,在左下的框中,如上图示输入“AT”(不带引号),勾选上方的Send with Enter“(发送并执行)后,单击输入框右侧的Send Command,结果如下图示。返回”OK“
如能返回”OK“则证明已与模块建立了正确的AT通讯,可进入下一步。
如返回值不是OK,或不返回,重新连接并重新测试,一般是端口错误。
2、SIM卡联网测试
将SIM卡放进模组中,在指令发送框中依次发送以下命令
也可以通过导入ini文件的方法一次性执行这些指令
单击右下的Load Test Script选择ini文件打开即可
本测试ini下载地址:https://yzui.xyz/yiban/NETTEST.ini
下载后在Load Test Script中选择并打开即可载入该测试
测试需调整右下参数
Run Times是运行次数,一般为1
下边的是每次循环的时间间隔
当连接好模块后,点击Run就可以自动运行了
运行结果如下,右侧框内全是OK则证明已连接上移动网络,如有错误建议重新运行QCOM,或断开连接线后一段时间再试。反复测试有问题的,优先考虑SIM卡问题。
AT
指令:AT
功能:测试AT指令功能是否正常``
AT
OK
AT+CPIN?
指令:AT+CPIN?
功能:查询SIM卡是否正常,返回ready则表示SIM卡正常
示例,如果SIM卡插入成功,则返回结果为:
AT+CPIN?
+CPIN: READY
OK
如果未插入SIM卡,则返回结果为:
AT+CPIN?
+CME ERROR: 10
AT+CSQ
指令:AT+CSQ
功能:查询模组的信号强度,第一个值为0-31则正常,99为不正常,第二个参数是信道误码率 bit error rate, 只有通话建立后, 才能获知该值。
示例:
AT+CSQ
+CSQ: 19,99
OK
AT+CREG?
指令:AT+CREG?
功能:查询模组是否注册上GSM网络,+CREG:0,1 表示已注册上本地网,+CREG:0,5表示注册上漫游网。
示例:
AT+CREG?
+CREG: 0,1
OK
AT+CGATT?
指令:AT+CGATT?
功能:返回:+CGATT:1,表示网络已激活;若返回:+CGATT:0,则表示网络未激活,请尝试重启模组激活网络。
示例:
AT+CGATT?
+CGATT:1
OK
AT+CEREG=1
指令:AT+CEREG=1
功能:该命令用于查询终端EPS网络注册状态。当使能提示时,终端的网络注册状态信息有变化,会主动上报给用户终端。通过不同的设置可以上报EPS注册状态、位置区码、小区ID、服务小区的接入技术等信息,通常情况下只需要设置为自动上报EPS注册状态。
示例:
AT+CEREG=1
OK
AT+CIPMUX=0
指令:AT+CIPMUX=0
功能:设置为单路连接
示例:
AT+CIPMUX=0
OK
AT+CIPMODE=0
指令:AT+CIPMUX=0
功能:设置为非透传模式
示例:
AT+CIPMUX=0
OK
AT+CIPMODE=1
指令:AT+CIPHEAD=1
功能:设置接收到消息时显示IP头,格式为:"+IPD,data length:"
示例:
AT+CIPHEAD=1
OK
4.服务器配置·建立TCP服务器
首先要拥有一台能通过公网IP远程连接的服务器
可选择云服务器作为平台(学生可通过阿里云考试及认证后,免费领取一台云服务器,但续约需要做题,且如不续约则不能再领取。其他平台有云服务器学生机的优惠,比较便宜,可以考虑)
这里以华为云的鲲鹏学生机服务器为例,演示TCP服务器的配置过程
另外注意,华为云的鲲鹏系列处理器是ARM架构处理器,并不完全支持X86指令集,因此,部分Linux上的操作可能会报错,拿来准备做开发平台的需要格外注意。(特别注意,华为自家OpenHarmony的运行环境无法搭建在该架构服务器上!!!)
华为云:https://www.huaweicloud.com/?locale=zh-cn
1、购买并初始化服务器
自行购买服务器,初始化时注意一点更要安装CentOS7.X或Ubuntu18的系统,便于后续安装宝塔面板(华为云部分服务器没有CentOS,其他平台有CentOS的,首选CentOS)
2、初始化后,在华为云主页右上角的“控制台——弹性云服务器ECS”中可以找到已购买并完成配置的云服务器
进入并选择远程登陆
选择CloudShell登录
输入预留并配置好的账号密码,点击连接进入
进入后的界面,到此时,已与云服务器完成连接
3、安装宝塔面板和进行一些服务器相关配置
宝塔的安装与配置请参照:https://www.bt.cn/bbs/thread-19376-1-1.html
本文不再赘述
安装完宝塔后,进入宝塔主控页面
主控页面地址一般是:(服务器公网IP地址) X.X.X.X:8888 的格式
服务器公网IP可在控制台的服务器详情页查询到
下图是宝塔的主控页面(因时间问题,没有将服务器重装,故现在显示的是配置完成后的图,具体配置过程,参考上述教程)
在宝塔的配置过程中,基本上都已安装了各种常用应用,但部分应用仍需用户手动添加
以本教程所用的Python监听接口的执行应用“Python项目管理器”为例
安装流程如下
点开左侧的“软件商店”
在上方搜索框中输入"Python"
安装第一个Python项目管理器(本图是已安装好的,未安装的会有安装选项)
等待其安装完成后,打开“首页显示”
完成后回到首页,在首页左下方打开Python项目管理器(未配置项目的打开不会有内容)
点击左侧的“版本管理”下拉Python版本,选择安装3.6.4版本,点击右侧的安装版本(初次配置为绿色的安装版本,现在显示的是已经安装好的)
注意!!!该应用安装Python版本时间极长,但万不可轻易取消,可以等他安装的同时,再打开一个首页,进行下面的配置
4、端口监听的实现
在Pychram中新建项目,将下面的内容复制进去,并保存为.py文件,如没有Pychram,新建TXT文本文档复制以下内容保存后,将后缀名改为.py也可行)文件名最好用英文或数字
import socket
import threading
class WSGIServer(object):
def __init__(self, port):
"""初始化对象"""
# 创建套接字
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 解决程序端口占用问题
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定本地ip地址
self.tcp_server_socket.bind(("", port))
# 将套接字变为监听套接字,最大连接数量为100
self.tcp_server_socket.listen(100)
def run_forever(self):
"""设备连接"""
while True:
# 1.等待设备连接(通过ip地址和端口建立tcp连接)
# 如果有设备连接,则会生成用于设备和服务器通讯的套接字:new_socket
# 会获取到设备的ip地址和端口
new_socket, client_addr = self.tcp_server_socket.accept()
print("设备{0}已连接".format(client_addr))
# 2.创建线程处理设备的需求
t1 = threading.Thread(target=self.service_machine, args=(new_socket, client_addr))
t1.start()
def service_machine(self, new_socket, client_addr):
"""业务处理"""
while True:
# 3.接收设备发送的数据,单次最大1024字节,按‘gbk’格式解码
receive_data = new_socket.recv(1024).decode("gbk")
# 4.如果设备发送的数据不为空
if receive_data:
# 4.1 打印接收的数据,这里可以将设备发送的数据写入到文件中
# 获取设备的ID信息
print(receive_data)
if receive_data[0:6] == "report":
response = "SET OK:" + receive_data
else:
receive_data = receive_data[6:].split(",")[0]
# 拼接响应数据
response = "alarm=" + receive_data + ",Switch:clear"
print(response)
# 4.2 返回原数据作为应答,按‘utf-8’格式编码
new_socket.send(response.encode("utf-8"))
# 5.当设备断开连接时,会收到空的字节数据,判断设备已断开连接
else:
print('设备{0}断开连接...'.format(client_addr))
break
# 关闭套接字
new_socket.close()
def main(port):
"""创建一个WEB服务器"""
wsgi_server = WSGIServer(port)
print("服务器已开启")
wsgi_server.run_forever()
if __name__ == '__main__':
port = 1902 # 指定端口
main(1902)
import socket
import threading
class WSGIServer(object):
def __init__(self, port):
"""初始化对象"""
# 创建套接字
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 解决程序端口占用问题
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定本地ip地址
self.tcp_server_socket.bind(("", port))
# 将套接字变为监听套接字,最大连接数量为100
self.tcp_server_socket.listen(100)
def run_forever(self):
"""设备连接"""
while True:
# 1.等待设备连接(通过ip地址和端口建立tcp连接)
# 如果有设备连接,则会生成用于设备和服务器通讯的套接字:new_socket
# 会获取到设备的ip地址和端口
new_socket, client_addr = self.tcp_server_socket.accept()
print("设备{0}已连接".format(client_addr))
# 2.创建线程处理设备的需求
t1 = threading.Thread(target=self.service_machine, args=(new_socket, client_addr))
t1.start()
def service_machine(self, new_socket, client_addr):
"""业务处理"""
while True:
# 3.接收设备发送的数据,单次最大1024字节,按‘gbk’格式解码
receive_data = new_socket.recv(1024).decode("gbk")
# 4.如果设备发送的数据不为空
if receive_data:
# 4.1 打印接收的数据,这里可以将设备发送的数据写入到文件中
# 获取设备的ID信息
print(receive_data)
if receive_data[0:6] == "report":
response = "SET OK:" + receive_data
else:
receive_data = receive_data[6:].split(",")[0]
# 拼接响应数据
response = "alarm=" + receive_data + ",Switch:clear"
print(response)
# 4.2 返回原数据作为应答,按‘utf-8’格式编码
new_socket.send(response.encode("utf-8"))
# 5.当设备断开连接时,会收到空的字节数据,判断设备已断开连接
else:
print('设备{0}断开连接...'.format(client_addr))
break
# 关闭套接字
new_socket.close()
def main(port):
"""创建一个WEB服务器"""
wsgi_server = WSGIServer(port)
print("服务器已开启")
wsgi_server.run_forever()
if __name__ == '__main__':
port = 1902 # 指定端口
main(1902)**
接下来要将写好的.py文件上传到服务器中
进入服务器的文件选项中,进入wwwroot文件夹
在wwwroot中新建一个文件夹,自主命名,进入文件夹中
单击开始上传
5.与服务器通讯测试(一)
6.服务器配置·建立通讯数据存储池
7.与服务器通讯测试(二)
8.单片机配置·通讯板控制程序
9.单片机与通讯板连接
10.单片机配置·数据采集程序
11.服务器配置·数据池处理
11.服务器配置·数据展示
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了AT的使用,而开发板提供了大量能使我们快速便捷地处理数据的函数和方法。接下来将会讲到