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编程pygame模块实现移动的小车示例代码
Jan 03 Python
python scipy求解非线性方程的方法(fsolve/root)
Nov 12 Python
python自动化生成IOS的图标
Nov 13 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
python实现动态创建类的方法分析
Jun 25 Python
对Python3中列表乘以某一个数的示例详解
Jul 20 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
Python 高效编程技巧分享
Sep 10 Python
Django如何实现防止XSS攻击
Oct 13 Python
使用Pytorch实现two-head(多输出)模型的操作
May 28 Python
Python 数据可视化之Bokeh详解
Nov 02 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根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
2013/08/28 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
python利用微信公众号实现报警功能
2018/06/10 Python
pytorch permute维度转换方法
2018/12/14 Python
Python二元赋值实用技巧解析
2019/10/25 Python
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
学风建设主题班会
2015/08/17 职场文书
《迟到》教学反思
2016/02/24 职场文书
民事纠纷协议书
2016/03/23 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
MongoDB数据库之添删改查
2022/04/26 MongoDB
TypeScript 内置高级类型编程示例
2022/09/23 Javascript