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通过BF算法实现关键词匹配的方法
Mar 13 Python
在Python操作时间和日期之asctime()方法的使用
May 22 Python
有趣的python小程序分享
Dec 05 Python
对Python中内置异常层次结构详解
Oct 18 Python
Pandas读取并修改excel的示例代码
Feb 17 Python
详解python多线程之间的同步(一)
Apr 03 Python
django框架面向对象ORM模型继承用法实例分析
Jul 29 Python
python3 mmh3安装及使用方法
Oct 09 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
python raise的基本使用
Sep 10 Python
python使用ctypes库调用DLL动态链接库
Oct 22 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
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
python脚本设置系统时间的两种方法
2016/02/21 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
Python3标准库总结
2019/02/19 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
Python如何将函数值赋给变量
2020/04/28 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
行政部总经理岗位职责
2014/01/04 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
八达岭长城导游词
2015/01/30 职场文书
网络销售员岗位职责
2015/04/11 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python