python实现NB-IoT模块远程控制


Posted in Python onJune 20, 2018

本来想尝试下如果不使用运营商网络应用平台情况下,只是在服务商服务器上是否可以实现对终端完全控制,如果这样可行,那么物联网应用服务端更有灵活性。实际情况下,很难实现和运营商网络对等的处理,用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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中集合类型(set)学习小结
Jan 28 Python
Python 性能优化技巧总结
Nov 01 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
python list元素为tuple时的排序方法
Apr 18 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
python队列Queue的详解
May 10 Python
Windows10下 python3.7 安装 facenet的教程
Sep 10 Python
python实现堆排序的实例讲解
Feb 21 Python
Python递归实现打印多重列表代码
Feb 27 Python
Python字符串hashlib加密模块使用案例
Mar 10 Python
Django搭建项目实战与避坑细节详解
Dec 06 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 #Python
python自动发送邮件脚本
Jun 20 #Python
Python使用numpy模块创建数组操作示例
Jun 20 #Python
python实现自动发送邮件
Jun 20 #Python
Django实现登录随机验证码的示例代码
Jun 20 #Python
python实现Windows电脑定时关机
Jun 20 #Python
python通过微信发送邮件实现电脑关机
Jun 20 #Python
You might like
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
js切换div css注意的细节
2012/12/10 Javascript
JS Date函数整理方便使用
2013/10/23 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
深入浅析同源策略和跨域访问
2015/11/26 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
小程序点赞收藏功能的实现代码示例
2018/09/07 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
python实现Decorator模式实例代码
2018/02/09 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
Python解决八皇后问题示例
2018/04/22 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
舞蹈教育学专业自荐信
2014/06/15 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
单位车辆管理制度
2015/08/05 职场文书
2016小学新学期寄语
2015/12/04 职场文书
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python