python做物联网控制_python实现NB-IoT模块远程控制

本来想尝试下如果不使用运营商网络应用平台情况下,只是在服务商服务器上是否可以实现对终端完全控制,如果这样可行,那么物联网应用服务端更有灵活性。实际情况下,很难实现和运营商网络对等的处理,用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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码发展专访系列之一:低代码平台产品的使用者都是谁?

2019年开始&#xff0c;低代码爆火。有人认为它是第四代编程语言&#xff0c;有人认为它是开发模式的颠覆&#xff0c;也有人认为是企业管理模式的变革……有很多声音&#xff0c;社区讨论很热烈。CSDN随后展开低代码平台产品系列活动&#xff0c;包括低代码开发者认知度与应用…

进击的云原生,为开发者提供更多可能性

简介&#xff1a; 云原生为开发者提供了三方面便利&#xff1a;应用基础设施“零”维护、应用架构现代化“零”阻力、数字与物理世界“零”边界。 作者&#xff5c;易立 阿里云容器服务负责人 背景 ​ 云原生是云计算发展的必然产物&#xff0c;而云原生的持续生长也绝非偶然…

linux 分割pdf,PDFBox分割PDF文档

在前一章中&#xff0c;我们已经看到了如何将JavaScript添加到PDF文档。 现在来学习如何将给定的PDF文档分成多个文档。分割PDF文档中的页面可以使用Splitter类将给定的PDF文档分割为多个PDF文档。 该类用于将给定的PDF文档分成几个其他文档。以下是拆分现有PDF文档的步骤第1步…

python3 读取文本文件_python3读取文件最简单的办法

原博文 2020-06-11 09:14 −file open(test.txt) #读文件 s file.read() #把文件放到字符串里面 print(s) #输出字符串 ... 相关推荐 2019-12-09 20:32 − [TOC] # 1. 模块 ## 1.1 模块是什么&#xff1f; - 模块就是个 *Python* 文件 - 一个模块就是一个包含 *Python* 代码…

常用的几款工具让 Kubernetes 集群上的工作更容易

作者 | Addo Zhang来源 | 云原生指北其实日常工作中在集群上的操作也非常多&#xff0c;今天就来介绍我所使用的工具。kubectl-alias使用频率最高的工具&#xff0c;我自己稍微修改了一下&#xff0c;加入了 StatefulSet 的支持。这个是我的 https://github.com/addozhang/kube…

以太坊白皮书_以太坊发展历程

2013年年末&#xff0c;以太坊创始人Vitalik Buterin发布了以太坊初版白皮书&#xff0c;在全球的密码学货币社区陆续召集到一批认可以太坊理念的开发者&#xff0c;启动了项目。2014年2月&#xff0c;Vitalik在迈阿密比特币会议上第一次公布了以太坊项目&#xff0c;核心开发团…

来电科技:基于 Flink + Hologres 的实时数仓演进之路

简介&#xff1a; 本文将会讲述共享充电宝开创企业来电科技如何基于 Flink Hologres 构建统一数据服务加速的实时数仓 作者&#xff1a;陈健新&#xff0c;来电科技数据仓库开发工程师&#xff0c;目前专注于负责来电科技大数据平台离线和实时架构的整合。 深圳来电科技有限…

linux find 图片,linuxfind命令的介绍【图解】

作为一种分时的特数操作系统&#xff0c;Linux具备Windows和mac OS与众不同的操作界面和用户体验&#xff0c;虽然它并不是最主流的操作系统&#xff0c;但是它会作为操作系统而得到众多程序开发人员的青睐和熟知。find命令是操作系统环境下进行计算机功能调用的特殊命令&#…

matlab中patch命令_matlab中patch函数的用法——emily

patch创建补片图形对象句法&#xff1a;patch(X,Y,C)patch(X,Y,Z,C)patch(FV)patch(...PropertyName,propertyvalue...)patch(PropertyName,propertyvalue,...)handle patch(...)描述&#xff1a;patch是个底层的图形函数&#xff0c;用来创建补片图形对象。一个补片对象是由其…

移动云TeaTalk:这是一场云数据库技术的深度对话!

随着云计算的发展&#xff0c;数据库上云已经成为趋势&#xff0c;云数据库服务相对于传统数据库在架构、性能与安全等方面都存在着新的挑战。11月23日&#xff0c;移动云TeaTalk线上直播活动成功举办。本次活动以“云数据库技术创新研究与实践”为主题&#xff0c;邀请了移动云…

devc++源文件未编译_iOS 编译知识小结

简介源码到可执行文件流程编译器 编译流程预处理(preprocessor)词法分析(lexical anaysis)语法分析(semantic analysis)CodeGen生成汇编代码生成目标文件生成可执行文件Xcode中查看Clang编译.m文件信息 Xcode常见编译报错分析1. duplicate symbols报错2. symbol(s) not found f…

微信不再提供小程序打开App?借助H5为App引流的方式你必须知道!

简介&#xff1a; 2021年5月14日App开发者领域发布了一条重要消息&#xff1a;微信开放平台为了提升用户体验&#xff0c;将于2021年5月20日&#xff08;后来延期到2021年5月27日&#xff09;起不再提供“小程序打开App技术服务”&#xff0c;现在能够实现从微信打开App的方式只…

linux函数进程撤销,Linux进程控制函数

1. fork()#include#includepid_t fork(void);一个进程可以调用fork函数创建一个新进程&#xff0c;由fork创建的进程被称为子进程&#xff0c;子进程是父进程的副本&#xff0c;它将获得父进程的数据空间&#xff0c;队&#xff0c;栈等资源副本pid_t 是一个宏定义&#xff0c;…

Gartner APM 魔力象限技术解读——全量存储? No! 按需存储?YES!

简介&#xff1a; 在云原生时代&#xff0c;充分利用边缘节点的计算和存储能力&#xff0c;结合冷热数据分离实现高性价比的数据价值探索已经逐渐成为 APM 领域的主流。 作者&#xff1a;夏明&#xff08;涯海&#xff09; 调用链记录了完整的请求状态及流转信息&#xff0c;是…

vue2.0项目部署到服务器_vue项目运行npm run build打包后如何发布到服务器?

运行npm run build后&#xff0c;怎么发布到服务器&#xff1f;这样就打包成功了。然后我的项目根目录就会多一个dist文件夹&#xff0c;里面包含static文件夹(存放img、css、js等文件)和index.html。然后我又复制了一点文件进来&#xff1a;build/dev-server.jsconfig/dev.env…

山石网科发布数据安全综合治理体系,覆盖数据全生命周期

编辑 | 宋慧 出品 | CSDN 云计算 11月24日&#xff0c;在“从一维到多维 &#xff0c;让数据安全有章可循——山石网科数据安全综合治理体系发布会”上&#xff0c;山石网科面向全行业推出《数据安全治理白皮书》&#xff0c;并向企业侧正式发布全新的数据安全治理体系和数据安…

android 获取cpu使用率_超详细的zabbix监控windows磁盘IO及cpu使用率教程

概述今天主要介绍怎么用zabbix来监控windows CPU使用率及磁盘IO&#xff0c;下面一起来看看吧~1、监控Windows-CPU使用率1.1、创建模板在zabbix中&#xff0c;默认的模板不带CPU使用率的监控&#xff0c;为减少重复工作率&#xff0c;在template模板下创建一个模板然后模板直接…

深入理解领域驱动设计中的聚合

简介&#xff1a; 聚合模式是 DDD 的模式结构中较为难于理解的一个&#xff0c;也是 DDD 学习曲线中的一个关键障碍。合理地设计聚合&#xff0c;能清晰地表述业务一致性&#xff0c;也更容易带来清晰的实现&#xff0c;设计不合理的聚合&#xff0c;甚至在设计中没有聚合的概念…

jenkins linux 发邮件,linuxea:jenkins pipeline邮件提醒的两种方式(5)

可以通过Mailer Plugin和Email-ext plugin插件发送邮件在pipeline中可以在执行完成进行&#xff0c;通过直接的结果发送失败或者成功&#xff0c;也可以在执行阶段过程中&#xff0c;如果在那个阶段执行失败发送&#xff0c;想看第一中&#xff0c;只发送失败的详细结果&#x…

ftp4j jar maven依赖_maven系列--maven添加第三方、本地依赖

一、问题背景最近在微信公众号开发时遇到一个问题&#xff0c;需要使用一个微信开发框架。处理方式是&#xff1a;手动下载该框架的jar包&#xff0c;再将其作为第三方依赖添加到maven。问题是如何在pom文件中配置呢&#xff1f;二、实现方法声明&#xff1a;该依赖为微信公众号…