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 相关文章推荐
KMP算法精解及其Python版的代码示例
Jun 01 Python
python交互式图形编程实例(三)
Nov 17 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
TensorFlow变量管理详解
Mar 10 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
python如何实现代码检查
Jun 28 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
python爬取天气数据的实例详解
Nov 20 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+MYSQL的文章管理系统(一)
2006/10/09 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
PDO::setAttribute讲解
2019/01/29 PHP
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
js日期联动示例
2014/05/02 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
Python中for循环控制语句用法实例
2015/06/02 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
linux环境下Django的安装配置详解
2019/07/22 Python
Django多数据库的实现过程详解
2019/08/01 Python
python支付宝支付示例详解
2019/08/22 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
物理教师自荐信范文
2013/12/28 职场文书
生产部主管岗位职责
2014/01/06 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
2014年英语工作总结
2014/12/20 职场文书