NB-IoT使用笔记(3)在linux下使用python搭建UDP服务
背景
NB-IoT可以通过UDP服务访问NB卡绑定的IP地址。关于绑定,目前因为NB-IoT出来时间不长,能绑定几个IP地址以及绑定的IP能否更改一直是一个谜一样的问题,我从不同的客服那里了解的信息还没有匹配的上的(这里指的是NB电信卡0)。
既然要使用UDP,前提当然是自己有个公网服务器了,所以还没有的童鞋就抓紧时间搞一个吧,目前国内的各大虚拟服务器提供商都行,如果是大学生的话还会有优惠,机不可失,时不再来。
有了服务器,就可以着手开始了,C语言或者python的都可以,网上也有一些博客关于搭建UDP服务端的代码,其实基本功能都是一个数据回发,本文的不同时:
- 提供UDP转发数据的解析(可选)。
- 生成后台log文件,方便查看服务器响应历史。
- 在后台运行,即使退出用户的Telnet连接也不会关闭服务。
- python语言编程(好吧,这个是我厚颜无耻加的用来凑数的~)。
预备知识
起码有下面的基础知识吧~
- linux掌握系统的基本操作
- python语言编程
- udp服务的理解
在这里,提一下UDP转发的相关内容,由于NB-IoT现在只能向已经绑定的几个IP发送数据包,如果有连接多余这个个数的IP地址的需求的话,需要一个UDP转发的中间服务器负责进行数据转发,具体文档我已经上传到了UDP转发网关数据格式详解-CSDN下载,由需要的童鞋可以下载下来看看~
这里我贴出需要用到部分的截图:
先是发送数据包的格式:
接收数据包格式:
最最最后,最开始测试的时候,不建议直接使用NB-IoT模块去测试,毕竟两边现在都还没完事,推荐大家使用一些网络调试助手之类的小工具,简单易用,一搜就有~
代码
一如既往地简单粗暴,先来代码:
#!/usr/bin/env python
# -*- coding:utf8 -*-import sys
import time
import os
from time import sleep
reload(sys)
sys.setdefaultencoding('utf-8')
# make a copy of original stdout route
stdout_backup = sys.stdout
# define the log file that receives your log info
log_file = open("ser_message.log", "a")
# redirect print output to log file
sys.stdout = log_file
log_file.close()#wether it's from foward server
udp_foward = 1import socketdef showHex(s):for c in s:print("%x"%(ord(c))),print("\ntotal length is:%d"%(len(s)))def showAddr(s):port = ord(s[4])+ord(s[5])*256print("from:%3d.%3d.%3d.%3d"%(ord(s[0]),ord(s[1]),ord(s[2]),ord(s[3]))),print(":%4d"%(port))class UdpServer(object):def tcpServer(self):sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)sock.bind(('', 9527)) # 绑定同一个域名下的所有机器while True:recvData, (remoteHost, remotePort) = sock.recvfrom(1024)log_file = open("ser_message.log", "a")sys.stdout = log_fileprint "****************************"print time.strftime("%Y-%m-%d %X",time.localtime(time.time()))print("[%s:%s] connect" % (remoteHost, remotePort)) # 接收客户端的ip, portif udp_foward and len(recvData)>6:showHex(recvData)print "recvData :", recvDataprint "recvData(sub):", recvData[6:]showAddr(recvData)sendDataLen = sock.sendto(recvData, (remoteHost, remotePort))#sendDataLen = sock.sendto(recvData[:7]+"this is echo data from server", ( remoteHost, remotePort))print("sendData(%3d):%s"%(sendDataLen,recvData))#print "sendDataLen: ", sendDataLenelse:print "recvData: ", recvDatasendDataLen = sock.sendto("this is echo data from server", (remoteHost, re motePort))print "sendDataLen: ", sendDataLen#print("sendData(%3d):%s"%(sendDataLen,recvData))print "****************************"print "\n"log_file.close()sys.stdout = stdout_backupsock.close()if __name__ == "__main__":udpServer = UdpServer()udpServer.tcpServer()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
其种 udp_foward 可以设置是否开启转发数据解析模式,当然在接收的数据不足6个字节的转发数据包头大小时也会安装普通数据进行处理。
万事俱备只欠东风,接下来就愉快地运行程序吧,linux命令行输入:
nohup python u_server_log.py &
- 1
这里使用 nohup 运行命令可以使得程序在用户退出Telnet后仍然运行,后面的 & 可以让程序运行在后台(用户仍然可以在命令行运行命令,fg和bg可以实现前后台任务切换),注意两者的区别,如果不加 nohup 无论程序在不在后台执行当执行 logout 退出后服务就不存在了,即程序作为子进程伴随着用户父进程被杀死。
运行测试
这里使用了一个常见的网络调试助手,首先建立一个UDP的client连接:
然后,在数据发送窗口输入要发送的数据,点击“发送数据”就可以看到完美的数据了,233333
这里,我默认开启了解析转发数据,但是这其实不会影响到数据在客户端的呈现除非数据字节小于6,如下:
再来看看,服务器这边的log信息,在同一目录下执行:
vim ser_message.log
- 1
可以看到,底下的两个数据都是一堆???,这是因为程序中使用的utf8的编码方式,而我的网络调试助手是Unicode编码的,上面的第一天可以看到一个采用utf8格式的数据。
大概就这么多吧,感觉log信息输出到文件这个功能还是很不错的,服务器什么时候接受了什么数据一目了然,当然大家根据自己的需求编写程序实现特定功能吧~
最最最最后,欢迎小伙伴们交流,一起学习
转自https://blog.csdn.net/a1668659995/article/details/78359214
NB-IoT使用笔记(3)在linux下使用python搭建UDP服务相关推荐
- 2、Linux下编译并搭建AzerothCore服务端
目录 一.VM虚拟机 1 - 初始化虚拟机 2 - 安装ubuntu-20.04-desktop-amd64 3 - 系统设置 4 - root用户设置 5 - 查看ip地址 二.编码源码 1 - U ...
- linux搭建直播步骤,Linux 下 nginx + rtmp 搭建直播服务
简单粗暴直接上步骤吧: 注 : 以下示例使用的是nginx(版本1.15.3) rtmp(版本1.2.1) 下载nginx和rtmp模块 下载nginx 解压 tar xvf nginx-1.15 ...
- linux使用flask设计网站,linux下Flask框架搭建简单网页
开始安装FLASK需要创建一个虚拟环境,虚拟环境可以不干扰正在使用的系统环境,避免影响,并且也不需要完全的root权限,更加安全可靠. 搭建环境 Python3.4 进入到microblog目录下创建 ...
- 13、《Libevent中文帮助文档》学习笔记13:Linux下集成、运行libevent
Linux下编译libevent的指导可以参考<4.<Libevent中文帮助文档>学习笔记4:Linux下编译libevent>,完成编译.安装,生成so库后,其他程序即可依 ...
- linux下能运行python,(转)Linux下运行python
原文: http://blog.csdn.net/jackywgw/article/details/48847187 在linux命令行下运行python,可以直接输出hello world jack ...
- Linux下开发环境搭建---2. emacs篇
Linux下开发环境搭建---2. emacs篇 本节主要参考: 曹乐的<在Emacs下用C/C++编程> 王纯业的<Emacs 一个强大的平台> ...
- linux下nginx+python+fastcgi部署总结(web.py版)
2019独角兽企业重金招聘Python工程师标准>>> 在上一篇文章linux下nginx+python+fastcgi部署总结(django版)中,我们部署了nginx+djang ...
- Linux下的NFS搭建配置
Linux下的NFS搭建配置 一.NFS介绍 1.NFS简介 2.NFS特点 二.环境介绍 三.服务端配置 1.创建共享目录 2.检查NFS包是否安装 3.安装nfs相关包 4.编辑配置文件 5.重启 ...
- Linux下FTP服务器搭建
Linux下FTP服务器搭建 一.FTP介绍 二.环境介绍 三.FTP服务端搭建步骤 1.安装相关软件包 2.启动FTP并检查状态 3.检查服务端口运行状态 4.修改FTP配置文件 5.关闭selin ...
最新文章
- 创建一个表单,输入数据并且存入到数据库
- endnote中科大版区别_研究生科研入门Endnote文献管理软件使用
- 在同一个workprocess里对两张表分别使用online update和update function module update
- Android学习手记(2) Activity生命周期
- JS判断浏览器是否支持某一个CSS3属性
- CANN 5.0硬核技术抢先看
- js实现扫描付款码获取数据
- 产品研发过程管理专题——软件测试过程管理实践
- java虚拟机学习笔记 【3】
- EasyRecovery 15win/mac易恢复序列号
- matlab如何设置数值类型,matlab数据类型(数值类型)
- 【thm】windows内网提权之Windows PrivEsc
- 2022第十七届巴拿马春晚-113万海内外观众欢聚迎新春
- 美国国立卫生研究院利用AI自动检测肺部异常,突破数据收集瓶颈
- 手机上日程应该怎么设置提醒
- Windows mysql secure_file_priv 设置
- 被知网侵权长达13年!小说作家:一周前才知道
- URL Protocol- -(coolice)
- 电脑打死都连不上手机热点问题
- 【opensource】开源网址推荐
热门文章
- Codeforces 780G Andryusha and Nervous Barriers
- ML之FE:风控场景之金融评分卡模型之利用LoR模型权重变量系数正负符号结合p-value/P值大小实现变量筛选
- LLVM 目标无关代码生成器
- 产品读书《设计中的设计》-设计
- 计算机科学与技术职业生涯规划,计算机科学与技术职业生涯规划ppt
- 基于Spring boot框架开发的电商网站系统
- 逆向微信Mac客户端:微信情话助手初版
- 35岁前要培养的66种思维(上)
- 计算机散热程序,电脑的散热方法_百度经验
- 下载并安装MS office 365