背景

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服务相关推荐

  1. 2、Linux下编译并搭建AzerothCore服务端

    目录 一.VM虚拟机 1 - 初始化虚拟机 2 - 安装ubuntu-20.04-desktop-amd64 3 - 系统设置 4 - root用户设置 5 - 查看ip地址 二.编码源码 1 - U ...

  2. linux搭建直播步骤,Linux 下 nginx + rtmp 搭建直播服务

    简单粗暴直接上步骤吧: 注 : 以下示例使用的是nginx(版本1.15.3) rtmp(版本1.2.1) 下载nginx和rtmp模块 下载nginx 解压 ​ tar xvf nginx-1.15 ...

  3. linux使用flask设计网站,linux下Flask框架搭建简单网页

    开始安装FLASK需要创建一个虚拟环境,虚拟环境可以不干扰正在使用的系统环境,避免影响,并且也不需要完全的root权限,更加安全可靠. 搭建环境 Python3.4 进入到microblog目录下创建 ...

  4. 13、《Libevent中文帮助文档》学习笔记13:Linux下集成、运行libevent

    Linux下编译libevent的指导可以参考<4.<Libevent中文帮助文档>学习笔记4:Linux下编译libevent>,完成编译.安装,生成so库后,其他程序即可依 ...

  5. linux下能运行python,(转)Linux下运行python

    原文: http://blog.csdn.net/jackywgw/article/details/48847187 在linux命令行下运行python,可以直接输出hello world jack ...

  6. Linux下开发环境搭建---2. emacs篇

    Linux下开发环境搭建---2. emacs篇 本节主要参考:      曹乐的<在Emacs下用C/C++编程>      王纯业的<Emacs 一个强大的平台>      ...

  7. linux下nginx+python+fastcgi部署总结(web.py版)

    2019独角兽企业重金招聘Python工程师标准>>> 在上一篇文章linux下nginx+python+fastcgi部署总结(django版)中,我们部署了nginx+djang ...

  8. Linux下的NFS搭建配置

    Linux下的NFS搭建配置 一.NFS介绍 1.NFS简介 2.NFS特点 二.环境介绍 三.服务端配置 1.创建共享目录 2.检查NFS包是否安装 3.安装nfs相关包 4.编辑配置文件 5.重启 ...

  9. Linux下FTP服务器搭建

    Linux下FTP服务器搭建 一.FTP介绍 二.环境介绍 三.FTP服务端搭建步骤 1.安装相关软件包 2.启动FTP并检查状态 3.检查服务端口运行状态 4.修改FTP配置文件 5.关闭selin ...

最新文章

  1. 创建一个表单,输入数据并且存入到数据库
  2. endnote中科大版区别_研究生科研入门Endnote文献管理软件使用
  3. 在同一个workprocess里对两张表分别使用online update和update function module update
  4. Android学习手记(2) Activity生命周期
  5. JS判断浏览器是否支持某一个CSS3属性
  6. CANN 5.0硬核技术抢先看
  7. js实现扫描付款码获取数据
  8. 产品研发过程管理专题——软件测试过程管理实践
  9. java虚拟机学习笔记 【3】
  10. EasyRecovery 15win/mac易恢复序列号
  11. matlab如何设置数值类型,matlab数据类型(数值类型)
  12. 【thm】windows内网提权之Windows PrivEsc
  13. 2022第十七届巴拿马春晚-113万海内外观众欢聚迎新春
  14. 美国国立卫生研究院利用AI自动检测肺部异常,突破数据收集瓶颈
  15. 手机上日程应该怎么设置提醒
  16. Windows mysql secure_file_priv 设置
  17. 被知网侵权长达13年!小说作家:一周前才知道
  18. URL Protocol- -(coolice)
  19. 电脑打死都连不上手机热点问题
  20. 【opensource】开源网址推荐

热门文章

  1. Codeforces 780G Andryusha and Nervous Barriers
  2. ML之FE:风控场景之金融评分卡模型之利用LoR模型权重变量系数正负符号结合p-value/P值大小实现变量筛选
  3. LLVM 目标无关代码生成器
  4. 产品读书《设计中的设计》-设计
  5. 计算机科学与技术职业生涯规划,计算机科学与技术职业生涯规划ppt
  6. 基于Spring boot框架开发的电商网站系统
  7. 逆向微信Mac客户端:微信情话助手初版
  8. 35岁前要培养的66种思维(上)
  9. 计算机散热程序,电脑的散热方法_百度经验
  10. 下载并安装MS office 365