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中的文件与目录操作
Jul 11 Python
python ansible服务及剧本编写
Dec 29 Python
Python语言快速上手学习方法
Dec 14 Python
把pandas转换int型为str型的方法
Jan 29 Python
详解python 爬取12306验证码
May 10 Python
Python+pyplot绘制带文本标注的柱状图方法
Jul 08 Python
python反转列表的三种方式解析
Nov 08 Python
Python数据分析pandas模块用法实例详解
Nov 20 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Django通过json格式收集主机信息
May 29 Python
Python如何定义有默认参数的函数
Aug 10 Python
python实现双链表
May 25 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
解析dedeCMS验证码的实现代码
2013/06/07 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
smarty获得当前url的方法分享
2014/02/14 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
JS交换变量的方法
2015/01/21 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
python使用nntp读取新闻组内容的方法
2015/05/08 Python
python动态网页批量爬取
2016/02/14 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
python如何调用字典的key
2020/05/25 Python
keras K.function获取某层的输出操作
2020/06/29 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
护士自我评价范文
2014/01/25 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
离婚协议书怎么写
2015/01/26 职场文书
小学教师教育随笔
2015/08/14 职场文书
会议承办单位欢迎词
2015/09/30 职场文书
总结几个非常实用的Python库
2021/06/26 Python
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android