[关闭]
@liruiyi962464 2025-04-17T08:18:50.000000Z 字数 10648 阅读 98

LTE-R网络无线质量采集终端部署文档

Linux服务器部署


for /L %i IN (1,1,254) DO ping -w 2 -n 1 172.0.0.%i

标题

一、设备链接

  1. 网口最右侧为wan口。其余4个为lan口。
  2. 默认接口ip:192.168.1.1。修改后:172.0.0.221
  3. 网线一端连接lan口,另一侧连接到计算机,通过接口ip接入到终端

二、配置网络

  1. 添加路由网关的方式
  2. route add default gw 172.0.0.8
  3. 修改DNS
  4. vi /etc/resolv.conf
  5. nameserver 180.76.76.76
  6. nameserver 114.114.114.144
  7. 测试网络连接情况
  8. ping baidu.com

三、修改下载地址

  1. 地址文件的位置: vi /etc/opkg/distfeeds.conf
  2. 删除并修改文件内容,为官方下载地址
  3. src/gz openwrt_core http://archive.openwrt.org/releases/23.05.0/targets/ramips/mt7621/packages
  4. src/gz openwrt_base http://archive.openwrt.org/releases/23.05.0/packages/mipsel_24kc/base
  5. src/gz openwrt_luci http://archive.openwrt.org/releases/23.05.0/packages/mipsel_24kc/luci
  6. src/gz openwrt_packages http://archive.openwrt.org/releases/23.05.0/packages/mipsel_24kc/packages
  7. src/gz openwrt_routing http://archive.openwrt.org/releases/23.05.0/packages/mipsel_24kc/routing
  8. src/gz openwrt_telephony http://archive.openwrt.org/releases/23.05.0/packages/mipsel_24kc/telephony

四、下载插件

  1. opkg update 更新可以获取的软件包列表
  2. opkg upgrade 对已经安装的软件包升级
  3. 下载连接文件传输
  4. opkg install vsftpd openssh-sftp-server
  5. 加入开机自启——/etc/init.d/vsftpd enable
  6. 启动——/etc/init.d/vsftpd start
  7. opkg install minicom
  8. opkg install make
  9. opkg install python3
  10. opkg install python3-pip
  11. opkg install luci-i18n-base-zh-cn
  12. 安装linux后台运行插件nohup
  13. opkg install nohup(将两个文件传送进去,需要手动下载 文件名如下:)
  14. coreutils_9.3-1_mipsel_24kc.ipk coreutils-nohup_9.3-1_mipsel_24kc.ipk
  15. pip3 install pyserial -i https://mirrors.aliyun.com/pypi/simple
  16. pip3 install flask -i https://mirrors.aliyun.com/pypi/simple
  17. pip3 install requests -i https://mirrors.aliyun.com/pypi/simple
  18. pip3 install ping3 -i https://mirrors.aliyun.com/pypi/simple
  19. ping3下载地址
  20. https://mirrors.aliyun.com/pypi/packages/e6/f4/4070daca3da5bbc3ef5e622d68f979e034e5bf678416817918e51a1b2907/ping3-4.0.8-py3-none-any.whl
  21. 汉化下载地址
  22. http://archive.openwrt.org/releases/23.05.0/packages/mipsel_24kc/luci/luci-i18n-base-zh-cn_git-24.101.63174-10fd9f2_all.ipk
  23. 文件存放地址
  24. python执行文件存放在 ./根目录下
  25. 自启动文件存放在./etc/init.d目录下
  26. 修改IP地址
  27. vi /etc/config/network
  28. /etc/init.d/network restart

五、设置自启动

  1. ln -s /etc/init.d/Start /etc/rc.d/S92Start
  2. chmod +x /etc/init.d/Start
  3. /etc/init.d/Start enable
  4. /etc/init.d/Start start
  1. root@OpenWrt:~# cat /etc/init.d/Start
  2. #!/bin/sh /etc/rc.common
  3. START=92
  4. STOP=15
  5. start(){
  6. python3 start.py
  7. }
  8. stop(){
  9. python3 start.py
  10. }
  11. restart(){
  12. python3 start.py
  13. }
  14. enable(){
  15. python3 start.py
  16. }
  17. disable(){
  18. python3 start.py
  19. }
  20. root@OpenWrt:~# cat /etc/rc.d/S92Start
  21. #!/bin/sh /etc/rc.common
  22. START=92
  23. STOP=15
  24. start(){
  25. python3 start.py
  26. }
  27. stop(){
  28. python3 start.py
  29. }
  30. restart(){
  31. python3 start.py
  32. }
  33. enable(){
  34. python3 start.py
  35. }
  36. disable(){
  37. python3 start.py
  38. }

六、接口说明

  1. 发送接口——at.py
  2. 传送IP地址,模组状态和卡状态———"http://"+ip_addr+":8091/jeecg-boot/system/deviceInfo/updateDeviceSIMStateAndMoudleState?ip="+data["ip"]+"&moudelState="+str(data["moudelState"])+"&simState="+str(data["simStat"])
  3. 传送信号值信息———"http://"+ip_addr+":8091/jeecg-boot/onlineStateDetection/deviceNetworkstatus/add"
  4. 接收接口——api.py
  5. 接收终端ping模组命令并执行操作——http://localhost:3562/ping
  6. 接收注册注销等命令并执行相关操作——http://localhost:3562/init

七、AT指令

  1. SIM卡开关机流程
  2. 开机初始化设置:
  3. AT
  4. AT+CIMI
  5. AT+CMEE=1
  6. ATE0
  7. AT+CGDCONT=1,"IP"
  8. 通电上电:
  9. AT+CFUN?
  10. AT+CFUN=1
  11. 轮询系统和网络信息
  12. AT+CSQ
  13. AT^SYSINFO
  14. AT+COPS=3,0
  15. AT+COPS?
  16. AT+COPS=3,2
  17. AT+COPS?
  18. 关机流程
  19. AT+CFUN=4
  20. AT+CFUN=0
  21. 搜网流程
  22. 测试当前可用的网络
  23. AT^SYSCONFIG?
  24. AT^SYSCONFIG=2,2,1,3
  25. AT+COPS=?
  26. 手动网络搜索
  27. AT^SYSCONFIG?
  28. AT+COPS=1,2,"46030",0
  29. AT+COPS=0
  30. 网络附着链接过程
  31. AT+CFUN=1
  32. AT+CGACT=1,1
  33. AT+ZGACT=1,1

八、代码文件

api.py

  1. from flask import Flask, jsonify, request,flash
  2. import at,requests,serial,time,os,ping3,threading
  3. app = Flask(__name__)
  4. app.secret_key = 'asdfghjkl'
  5. Dialer="/usr/local/bin/quectel-CM"
  6. tty_com="/dev/ttyUSB1"
  7. ip_addr = "172.0.0.10"
  8. @app.route('/ping/<ip>/<num>', methods=['POST', 'GET'])
  9. def ping(ip, num):
  10. result = os.popen('ping -c '+num+' '+ip, 'r')
  11. out = result.read()
  12. out = out.split('\n')
  13. num = len(out)
  14. # print(out)
  15. if num == 1:
  16. if out[0] == '':
  17. print("error")
  18. return "error"
  19. else:
  20. if out[1] == '':
  21. print("error")
  22. return "error"
  23. else:
  24. print(out)
  25. return out
  26. def send_AT(tty,cmd):
  27. tty.write(cmd.encode())
  28. data=ser.read(1)
  29. time.sleep(0.1)
  30. data = (data + ser.read(ser.inWaiting())).decode()
  31. return data
  32. @app.route('/init', methods=['POST', 'GET'])
  33. def init():
  34. global ser
  35. ser = serial.Serial(tty_com, 115200,
  36. bytesize=serial.EIGHTBITS,
  37. parity=serial.PARITY_NONE,
  38. stopbits=serial.STOPBITS_ONE,
  39. timeout=3600)
  40. state = request.args.get('state')
  41. print(state)
  42. if state.isdigit():
  43. try:
  44. os.system("kill $(pgrep -f 'python3 at.py')")
  45. if state == '0':
  46. datas = send_AT(ser,"AT+CFUN=1\r\n")
  47. time.sleep(1)
  48. elif state == '1':
  49. datas = send_AT(ser,"AT+CFUN=0\r\n")
  50. datas = send_AT(ser,"AT+ZEMCI=0\r\n")
  51. time.sleep(1)
  52. elif state == '2':
  53. datas = send_AT(ser,"AT+CFUN=1\r\n")
  54. time.sleep(1)
  55. elif state == '3':
  56. datas = send_AT(ser,"AT+CGATT=0\r\n")
  57. time.sleep(0.5)
  58. start_time = time.time()
  59. datas = send_AT(ser,"AT+CGATT=1\r\n")
  60. datas = datas.split('\r\n')[0]
  61. if datas == 'ok':
  62. end_time = time.time()
  63. time_interval = end_time-start_time
  64. print(time_interval)
  65. time.sleep(1)
  66. elif state == '4':
  67. datas = send_AT(ser,"AT+CEREG=1\r\nAT+CGDCONT=1,\"IP\"\r\nAT+CGACT=1,1\r\nAT+ZGACT=1,1\r\n")
  68. time.sleep(1)
  69. else:
  70. time.sleep(0.2)
  71. return state
  72. except:
  73. return 'error'
  74. finally:
  75. data = os.system("nohup python3 at.py >> /dev/null 2>&1 &")
  76. if __name__ == '__main__':
  77. app.run(host='172.0.0.221', port=3652, debug=True)

at.py

  1. import os,sys,re,time,serial,subprocess,requests,json,socket
  2. Dialer="/usr/local/bin/quectel-CM"
  3. tty_com="/dev/ttyUSB1"
  4. ip_addr = "172.0.0.10"
  5. def send_AT(tty,cmd):
  6. tty.write(cmd.encode())
  7. data=ser.read(1)
  8. time.sleep(0.1)
  9. data = (data + ser.read(ser.inWaiting())).decode()
  10. return data
  11. def cfun():
  12. global ser
  13. ser = serial.Serial(tty_com, 115200,
  14. bytesize=serial.EIGHTBITS,
  15. parity=serial.PARITY_NONE,
  16. stopbits=serial.STOPBITS_ONE,
  17. timeout=3600)
  18. datas = send_AT(ser,"AT+CFUN=0\r\n")
  19. datas = send_AT(ser,"AT+ZEMCI=0\r\n")
  20. time.sleep(0.5)
  21. # datas = send_AT(ser,"AT\r\nAT+CIMI\r\nAT+CMEE=1\r\nATE0\r\nAT+CGDCONT=1,\"IP\"\r\nAT+CFUN=?\r\nAT+CFUN=1\r\n")
  22. # datas = send_AT(ser,"AT+CSQ\r\nAT^SYSINFO\r\nAT+COPS=3,0\r\nAT+COPS?\r\nAT+COPS=3,2\r\nAT+COPS?\r\n")
  23. # datas = send_AT(ser,"AT^SYSCONFIG?\r\nAT+SYSCONFIG=2,2,1,3\r\nAT+COPS=?\r\n")
  24. datas = send_AT(ser,"AT+CFUN=1\r\n&AT+CGACT=1,1\r\n&AT+ZGACT=1,1\r\n")
  25. time.sleep(2)
  26. datas = send_AT(ser,"AT+CGACT=1,1\r\n")
  27. print("dadsqweqweqfas")
  28. time.sleep(2)
  29. datas = send_AT(ser,"AT+ZGACT=1,1\r\n")
  30. time.sleep(2)
  31. datas = send_AT(ser,"AT+ZEMCI=1\r\n")
  32. datas = send_AT(ser,"AT+CGPADDR=1\r\n")
  33. ip = datas.split('\r\n')[0]
  34. ser.close()
  35. return 0
  36. def attach():
  37. global ser
  38. ser = serial.Serial(tty_com, 115200,
  39. bytesize=serial.EIGHTBITS,
  40. parity=serial.PARITY_NONE,
  41. stopbits=serial.STOPBITS_ONE,
  42. timeout=3600)
  43. datas = send_AT(ser,"AT+ZGACT=1,1\r\n")
  44. time.sleep(1)
  45. ser.close()
  46. return 0
  47. def zemci():
  48. parameter = {}
  49. global ser
  50. ser = serial.Serial(tty_com, 115200,
  51. bytesize=serial.EIGHTBITS,
  52. parity=serial.PARITY_NONE,
  53. stopbits=serial.STOPBITS_ONE,
  54. timeout=3600)
  55. datas = send_AT(ser,"AT+ZEMCI=1\r\n")
  56. time.sleep(1.2)
  57. datas = send_AT(ser,"AT+ZEMCI=1\r\n")
  58. zemci = datas.split('\r\n')[1]
  59. # print(zemci)
  60. if zemci[5:10] != "ERROR" and zemci != "OK":
  61. try:
  62. zemci = zemci.split(':')[1]
  63. zemci = zemci.split(',')
  64. cellId = hex(int(zemci[0]))[2:]
  65. tac = zemci[2]
  66. band = zemci[6]
  67. rsrp = int(zemci[10])-140
  68. rsrq = int(zemci[11])*0.5-20
  69. pci = zemci[14][:4]
  70. earfcn = int(zemci[14][4:],16)
  71. datas = send_AT(ser,"AT+ZEMCI=0\r\n")
  72. csq = zemci[10]
  73. except:
  74. print("error")
  75. result = subprocess.check_output(['ifconfig'], shell=True)
  76. ifconfig_output = result.decode('utf-8')
  77. ip = ifconfig_output[78:89]
  78. parameter["ip"] = ip
  79. parameter["cellId"] = cellId
  80. parameter["tac"] = tac
  81. parameter["band1"] = band
  82. parameter["rsrp"] = rsrp
  83. parameter["rsrq"] = rsrq
  84. parameter["pci"] = pci
  85. parameter["earfcn"] = earfcn
  86. parameter["csq"] = csq
  87. parameter['zemci'] = zemci
  88. return parameter
  89. else:
  90. print("yizhuxiao")
  91. return "yizhuxiao"
  92. def state():
  93. parameter = {}
  94. global ser
  95. ser = serial.Serial(tty_com, 115200,
  96. bytesize=serial.EIGHTBITS,
  97. parity=serial.PARITY_NONE,
  98. stopbits=serial.STOPBITS_ONE,
  99. timeout=3600)
  100. result = subprocess.check_output(['ifconfig'], shell=True)
  101. ifconfig_output = result.decode('utf-8')
  102. ip = ifconfig_output[78:89]
  103. datas = send_AT(ser,"AT+CPIN?\r\n")
  104. card_status = datas.split('\r\n')[1]
  105. datas = send_AT(ser,"AT+CFUN?\r\n")
  106. fun = datas.split('\r\n')[1]
  107. # print(fun)
  108. if fun == '+CFUN: 0':
  109. moudelState = 0
  110. else:
  111. moudelState = 1
  112. if card_status == '+CME ERROR: 10':
  113. simState = 0
  114. else:
  115. simState = 1
  116. parameter["ip"] = ip
  117. parameter['moudelState'] = moudelState
  118. parameter['simState'] = simState
  119. return parameter
  120. def loop():
  121. data = {}
  122. global ser
  123. ser = serial.Serial(tty_com, 115200,
  124. bytesize=serial.EIGHTBITS,
  125. parity=serial.PARITY_NONE,
  126. stopbits=serial.STOPBITS_ONE,
  127. timeout=3600)
  128. datas = zemci()
  129. print(datas)
  130. if datas != "yizhuxiao" and datas["ip"] == '172.0.0.221':
  131. data = {
  132. "deviceIp":datas["ip"],
  133. "band1":datas["band1"],
  134. "cellId":datas["cellId"],
  135. "csq":datas["csq"],
  136. "earfcn":datas["earfcn"],
  137. "pci":datas["pci"],
  138. "rsrp":datas["rsrp"],
  139. "rsrq":datas["rsrq"],
  140. "tac":datas["tac"],
  141. }
  142. print(data)
  143. url = "http://"+ip_addr+":8091/jeecg-boot/onlineStateDetection/deviceNetworkstatus/add"
  144. print("123")
  145. response = requests.post(url,data=json.dumps(data),headers={"Content-Type":"application/json"})
  146. print(response)
  147. else:
  148. print("error")
  149. return data
  150. if __name__=="__main__":
  151. num = 0
  152. cfun()
  153. while True:
  154. try:
  155. data = state()
  156. # print(data)
  157. except Exception as e:
  158. print('error')
  159. result = os.system('ping -c 1 '+ip_addr+' >>/dev/null')
  160. print(result)
  161. attach()
  162. if result:
  163. time.sleep(10)
  164. print('error1')
  165. else:
  166. try:
  167. if num == 0:
  168. num = 1
  169. loop()
  170. print(2)
  171. time.sleep(5)
  172. url = "http://"+ip_addr+":8091/jeecg-boot/system/deviceInfo/updateDeviceSIMStateAndMoudleState?ip="+data["ip"]+"&moudelState="+str(data["moudelState"])+"&simState="+str(data["simState"])
  173. response = requests.get(url)
  174. elif num == 1:
  175. num = 0
  176. loop()
  177. print(200)
  178. time.sleep(5)
  179. url = "http://"+ip_addr+":8091/jeecg-boot/system/deviceInfo/updateDeviceSIMStateAndMoudleState?ip="+data["ip"]+"&moudelState="+str(data["moudelState"])+"&simState="+str(data["simState"])
  180. response = requests.get(url)
  181. except:
  182. print("error2")

attach_api.py

  1. from flask import Flask, jsonify, request,flash
  2. import at,requests,serial,time,os,ping3,threading
  3. app = Flask(__name__)
  4. app.secret_key = 'asdfghjkl'
  5. Dialer="/usr/local/bin/quectel-CM"
  6. tty_com="/dev/ttyUSB1"
  7. ip_addr = "172.0.0.10"
  8. def send_AT(tty,cmd):
  9. tty.write(cmd.encode())
  10. data=ser.read(1)
  11. time.sleep(0.1)
  12. data = (data + ser.read(ser.inWaiting())).decode()
  13. return data
  14. @app.route('/attach/<num>', methods=['POST', 'GET'])
  15. def attach(num):
  16. global ser
  17. ser = serial.Serial(tty_com, 115200,
  18. bytesize=serial.EIGHTBITS,
  19. parity=serial.PARITY_NONE,
  20. stopbits=serial.STOPBITS_ONE,
  21. timeout=3600)
  22. result = []
  23. if num.isnumeric():
  24. while True:
  25. try:
  26. for i in range(int(num)):
  27. time_interval = 0
  28. datas = send_AT(ser,"AT+CGATT=0\r\n")
  29. print(datas)
  30. time.sleep(1)
  31. t = time.time()
  32. start_time = int(round(t * 1000))
  33. datas = send_AT(ser,"AT+CGATT=1\r\n")
  34. datas = datas.split('\r\n')[1]
  35. if datas != 'ok':
  36. t = time.time()
  37. end_time = int(round(t * 1000))
  38. time_interval = end_time-start_time
  39. result.append(time_interval)
  40. else:
  41. result[i] = 'error'
  42. if len(result) == int(num):
  43. break
  44. time.sleep(0.5)
  45. break
  46. except:
  47. print("IndexError")
  48. # datas = send_AT(ser,"AT+CGATT?\r\n")
  49. return result
  50. else:
  51. return "error"
  52. if __name__ == '__main__':
  53. app.run(host='172.0.0.221', port=3653, debug=True)

start.py

  1. import threading,time,os
  2. def at1():
  3. os.system("python3 at.py")
  4. def api1():
  5. os.system("python3 api.py")
  6. def attach_api():
  7. os.system("python3 attach_api.py")
  8. if __name__=="__main__":
  9. t1 = threading.Thread(target=at1)
  10. t2 = threading.Thread(target=api1)
  11. t3 = threading.Thread(target=attach_api)
  12. t1.start()
  13. t2.start()
  14. t3.start()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注