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中的hashlib和base64加密模块使用实例
Sep 02 Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 Python
python3实现抓取网页资源的 N 种方法
May 02 Python
简单分析python的类变量、实例变量
Aug 23 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
python 子类调用父类的构造函数实例
Mar 12 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
简单了解Python字典copy与赋值的区别
Sep 16 Python
python如何快速拼接字符串
Oct 28 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
python实现商品进销存管理系统
May 30 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提示undefined index的几种解决方法
2012/05/21 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
HTML Color Picker(js拾色器效果)
2013/08/27 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
JavaScript制作弹出层效果
2016/12/02 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
vue-router 路由基础的详解
2017/10/17 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
python写入文件自动换行问题的方法
2019/07/05 Python
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
领导失职检讨书
2014/02/24 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
扬尘污染防治方案
2014/06/15 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
贫困证明怎么写
2015/06/16 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
小学校本教研总结
2015/08/13 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android
联想win10摄像头打不开怎么办?win10笔记本摄像头打不开解决办法
2022/04/08 数码科技
MySQL数据库 安全管理
2022/05/06 MySQL