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中的自省(反射)详解
Jun 02 Python
Python操作MongoDB详解及实例
May 18 Python
Django自定义分页效果
Jun 27 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
python代码打印100-999之间的回文数示例
Nov 24 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
python re模块匹配贪婪和非贪婪模式详解
Feb 11 Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 Python
基于python实现模拟数据结构模型
Jun 12 Python
python 指定源路径来解决import问题的操作
Mar 04 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/08/24 PHP
PHP页面中文乱码分析
2013/10/29 PHP
php实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
详解Vue方法与事件
2017/03/09 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
JavaScript 获取滚动条位置并将页面滑动到锚点
2021/02/08 Javascript
Python深入学习之内存管理
2014/08/31 Python
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
python scipy卷积运算的实现方法
2019/09/16 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
Python无损压缩图片的示例代码
2020/08/06 Python
Python 操作 MySQL数据库
2020/09/18 Python
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
安全教育感言
2014/03/04 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
跳高加油稿
2015/07/21 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
Golang: 内建容器的用法
2021/05/05 Golang
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python