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实现简单的相似图片搜索的教程
Apr 23 Python
Django admin美化插件suit使用示例
Dec 12 Python
纯用NumPy实现神经网络的示例代码
Oct 24 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
python实现指定字符串补全空格、前面填充0的方法
Nov 16 Python
Python enumerate函数功能与用法示例
Mar 01 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
Django之使用celery和NGINX生成静态页面实现性能优化
Oct 08 Python
Python单元测试与测试用例简析
Nov 09 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
Python中的turtle画箭头,矩形,五角星
Mar 16 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垃圾回收机制引用计数器概念分析
2013/06/24 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
node.js博客项目开发手记
2018/03/16 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
python实现文件分组复制到不同目录的例子
2014/06/04 Python
Python中MySQL数据迁移到MongoDB脚本的方法
2016/04/28 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
用Python进行简单图像识别(验证码)
2018/01/19 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
试述DBMS的主要功能
2016/11/13 面试题
营销计划书
2015/01/17 职场文书
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL