本来想尝试下如果不使用运营商网络应用平台情况下,只是在服务商服务器上是否可以实现对终端完全控制,如果这样可行,那么物联网应用服务端更有灵活性。实际情况下,很难实现和运营商网络对等的处理,用python代码原型确实能够实现参数的变化(如PSM,eDXR等),但是终端分配的IP地址毕竟属于接入网部分,更近似一个局域网,如果采用其他方式访问(如IMSI、IMEI等),还是需要与运营商核心网进行配合。以下是尝试远程控制的实现方法。
主要实现功能
1、使用python pyserial模块通过串口发送AT命令给模组进行参数修改,参考<使用python pyserial模块串口通信>;
2、通过inter网进行控制命令传输,选用UDP进行主机控制,参考<python socket网络接口编程>;
3、直接通过NB-IoT无线网络进行控制命令的传输;
4、python多窗口处理服务器端程序,实现接收和发送同时进行;
远程控制主机脚本
服务器端程序:监测UDP对应的端口号,如果接收到register信息则返回allowed,然后进入命令输入状态,等待命令输入完成,发送给终端,等待终端反馈,并接续下一个命令传送。
#!/usr/bin/python3.6 import socket import sys import re BUFFER_SIZE = 1024 TARGET_ADDR = '' TARGET_PORT = 60000 TARGET = (TARGET_ADDR,TARGET_PORT) ss = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) ss.bind(TARGET) print("server online!! wait for register!") data,addrRsv = ss.recvfrom(BUFFER_SIZE) if not data: sys.exit(0) else: print(data) if(re.match(b'register',data)): ss.sendto(b'allowed',addrRsv) else: ss.sendto(b'reject',addrRsv) while True: #等待命令输入 aa = input('cmd > ') if not aa: break else: cmdV = aa+'\r' ss.sendto(cmdV.encode('utf-8'),addrRsv) #等待结果返回 data,addrRsv = ss.recvfrom(BUFFER_SIZE) if not data: break else: print(data) ss.close()
客户主机程序:发送register并成功接收allowed后,等待控制命令,通过串口转发给终端模块,并接收终端模块的反馈消息,返回给服务器侧。
#!/usr/bin/python3.6 import serial import sys import os import re import socket #初始化UART端口 ser = serial.Serial("COM5",9600,timeout=30) #选择相应的协议类型UDP ss = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) BUFFER_SIZE = 1024 TARGET_ADDR = 'IP address' TARGET_PORT = 60000 TARGET = (TARGET_ADDR,TARGET_PORT) aa = '开机命令'.encode('utf-8') #convert to bytes type ser.write(aa) while True: line = ser.readline() if not line: print("can not get cmd result, release!") sys.exit(0) print(line) if ( re.match(b'OK',line) ): break ss.sendto(bytes('register','utf-8'),TARGET) data,addrRsv = ss.recvfrom(BUFFER_SIZE) if re.match(b'allowed',data): print('register successfully!') pass else: print('register failure') sys.exit(0) while True: data,addrRsv = ss.recvfrom(BUFFER_SIZE) if not data: print("time out,release now!!") break elif re.match(b'end',data): print("end of process!!") break; ser.write(data) while True: line = ser.readline() if not line: print("can not get cmd result, release!") break print(line) if ( re.match(b'OK',line) ): ss.sendto(bytes('OK','utf-8'),TARGET) break elif(re.match(b'ERROR',line)): ss.sendto(bytes('ERROR','utf-8'),TARGET) break else: pass ser.close()
多线程窗口
为了使得服务器端能够实现同时实现接收和发送,可以在服务器端开启两个窗口进行监听,示例如下:
启动代码
#!/usr/bin/python3.6 import threading import time import subprocess import os import sys def thread_fun1(): #global vlock while(1): print("thread fun1 is running!!!") time.sleep(1) #... ... print(len(sys.argv)) #vlock = threading.Lock() t1 = threading.Thread(target=thread_fun1,args=()) t1.start() addr = 'IP address' port = 60000 cmdStr = "python anotherThread.py %s %d"%(addr,port) #设置creationflags = subprocess.CREATE_NEW_CONSOLE,用来创建新的控制台窗口 subprocess.Popen(cmdStr,creationflags = subprocess.CREATE_NEW_CONSOLE)
anotherThread.py
#!/usr/bin/python3.6 def thread_fun2(): while(1): aa = input('cmd > ') print("thread fun2 is running!!!") print(aa) if(aa == 'end'): break thread_fun2()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年09月23日
2024年09月23日
- 华少翌.2005-华少翌【中唱艺能】【WAV+CUE】
- 群星《十二女声Ⅱ》[WAV/CUE/分轨][527MB]
- 大自然音乐系列《漫步在山裡》[WAV/CUE/分轨][502.8MB]
- 大自然音乐系列《星光夜语》[WAV/CUE/分轨][453.3MB]
- 史依弘《史依弘交响乐京剧演唱专辑HQ》头版限量编号[WAV+CUE]
- 曼丽2020《女人三十风继续吹》HQCD[WAV+CUE]
- 曼丽2021《女人三十2雾之恋》HQCD[WAV+CUE]
- 隔壁老樊.2019-我曾【好听音乐】【FLAC分轨】
- 高林生.1993-牵挂你的人是我【白天鹅】【WAV+CUE】
- 洪卓立.2012-找个懂我的女孩(国专)【英皇娱乐】【WAV+CUE】
- 曼丽2022《女人三十3晚秋》HQCD[WAV+CUE]
- 曼丽2018《女人三十4冬天》HQCD[WAV+CUE]
- 柏菲-《好歌30年壹》限量开盘母带ORMCD[低速原抓WAV+CUE]
- 大自然音乐系列《水舞》[WAV/CUE/分轨][424.3MB]
- 大自然音乐系列《星光夜语》[WAV/CUE/分轨][453.3MB]