本来想尝试下如果不使用运营商网络应用平台情况下,只是在服务商服务器上是否可以实现对终端完全控制,如果这样可行,那么物联网应用服务端更有灵活性。实际情况下,很难实现和运营商网络对等的处理,用python代码原型确实能够实现参数的变化(如PSM,eDXR等),但是终端分配的IP地址毕竟属于接入网部分,更近似一个局域网,如果采用其他方式访问(如IMSI、IMEI等),还是需要与运营商核心网进行配合。以下是尝试远程控制的实现方法。

主要实现功能

1、使用python pyserial模块通过串口发送AT命令给模组进行参数修改,参考<使用python pyserial模块串口通信>;

2、通过inter网进行控制命令传输,选用UDP进行主机控制,参考;

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实现NB-IoT模块远程控制相关推荐

  1. python和手势控制_Python手势识别与控制

    # Python手势识别与控制 ## 概述 本文中的手势识别与控制功能主要采用 [OpenCV](https://opencv.org/) 库实现, OpenCV是一个基于BSD许可(开源)发行的跨平 ...

  2. 用python做自我介绍_python入门教程NO.2 用python做个自我介绍

    本文涉及的python基础语法为:数据类型等 数据类型 1. 字符串的拼接 我们在上一章中已经简单介绍了一下字符串的创建方式,这里我们简单学习一下字符串的运算和拼接. 字符串的运算 `字符串的加法` ...

  3. 用python做一个木马_Python编程简单的木马程序(转载于乌云中)

    Python编程简单的木马程序 light·2015/01/26 10:07 0x00准备好了 本文的内容仅用于研究和研究,不得用于非法目的! 这一次,我们使用Python编写了一个简单的木马,它具有 ...

  4. python键盘上下左右控制_python方向键控制上下左右代码

    本文所示代码实现python编程方向键控制图片上下左右,我们首先看下演示结果. 演示: 实例代码: bif="1.jpg" mif="2.jpg" import ...

  5. python实时语音识别控制_Python实时语音识别控制

    Python实时语音识别控制 概述 本文中的语音识别功能采用 百度语音识别库 ,首先利用 PyAudio 库录制语音指令,保存为受支持的 wav 音频文件,然后利用 百度语音识别库 提供的方法实现语音 ...

  6. python做时序图_python如何做时间序列

    python做时间序列的方法:首先导入需要的工具包,输入"data.plot()","plt().show()"命令绘制时序图:然后由acf,pacf判断模型参 ...

  7. 用python做一个木马_Python编写简易木马程序

    light · 2015/01/26 10:07 0x00 准备 文章内容仅供学习研究.切勿用于非法用途! 这次我们使用Python编写一个具有键盘记录.截屏以及通信功能的简易木马.依然选用Subli ...

  8. python第七章_python 第七章 模块

    模块 一个py文件就是一个模块 模块一共三种:1.python标准库 2.第三方模块 3.应用程序自定义模块 import:1.执行对应文件 2.引入变量名 if__name__="__ma ...

  9. python网络爬虫应用_Python网络爬虫(requests模块应用1)

    一.什么是requests模块? requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在爬虫领域中占据着半壁江山的地位. 二.为什 ...

最新文章

  1. C++中的const关键字(zz)
  2. JavaMelody开源系统性能监控
  3. python中几种交换2个变量的值的方法
  4. 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)
  5. 无线鼠标接收器对码软件_接收器太小容易丢 这几招记好就不怕
  6. 关于批量插入数据之我见(100万级别的数据,mysql)
  7. keil5出现‘Target not created‘
  8. 【英语学习】【医学】Unit 03 Blood
  9. System.out.println 在idea控制台输出的中文乱码问题
  10. top刷新间隔_还在用top监控CPU?我们都在用glances
  11. laravel中数据显示(默认值和下拉option默认选中)
  12. 记仇表情包在线生成源码
  13. skywalking-安装部署
  14. 如何看计算机系统是x86,怎么看电脑是x86还是x64 x64和x86有区别讲解分享
  15. 未能加载 mysql.data,未能加载文件或程序集“MySql.Data”或它的某一个依赖项
  16. PowerMill2019基础到三四五轴编程视频教程全
  17. 20 行 Python 代码批量抓取免费高清图片!
  18. 使用BERT的两层encoder实现tweet sentiment extraction
  19. 那些改变过世界的代码都是怎么写的?
  20. 微信小程序自定义输入框个数

热门文章

  1. jq如何获取选中option的值_【分享】如何获取变量token的值
  2. 21岁MIT本科生推动数学重要问题新进展,曾获阿里数学竞赛奖
  3. 基础研究到底要基础到什么程度?
  4. 李开复:听AI大佬吐槽真实的人工智能
  5. 做了44年保洁员,一生只会5个字,她却成为香港大学院士
  6. 当爬虫遇到需要动态ip才能获取资源的时候如何解决?
  7. 搭建zookeeper集群环境详解
  8. 喜马拉雅 Apache RocketMQ 消息治理实践
  9. 媒体智能-淘宝直播流媒体互动实践 | D2 分享视频+文章
  10. 【远程办公】5分钟一拍照、10分钟一截屏 ?