NB-IoT使用笔记(3)在linux下使用python搭建UDP服务
来源:互联网 发布:灭绝师太 武功 知乎 编辑:程序博客网 时间:2024/06/05 18:57
背景
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 sysimport timeimport osfrom time import sleepreload(sys)sys.setdefaultencoding('utf-8')# make a copy of original stdout routestdout_backup = sys.stdout# define the log file that receives your log infolog_file = open("ser_message.log", "a")# redirect print output to log filesys.stdout = log_filelog_file.close()#wether it's from foward serverudp_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])*256 print("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_file print "****************************" print time.strftime("%Y-%m-%d %X",time.localtime(time.time())) print("[%s:%s] connect" % (remoteHost, remotePort)) # 接收客户端的ip, port if udp_foward and len(recvData)>6: showHex(recvData) print "recvData :", recvData print "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: ", sendDataLen else: print "recvData: ", recvData sendDataLen = 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_backup sock.close()if __name__ == "__main__": udpServer = UdpServer() udpServer.tcpServer()
其种 udp_foward 可以设置是否开启转发数据解析模式,当然在接收的数据不足6个字节的转发数据包头大小时也会安装普通数据进行处理。
万事俱备只欠东风,接下来就愉快地运行程序吧,linux命令行输入:
nohup python u_server_log.py &
这里使用 nohup 运行命令可以使得程序在用户退出Telnet后仍然运行,后面的 & 可以让程序运行在后台(用户仍然可以在命令行运行命令,fg和bg可以实现前后台任务切换),注意两者的区别,如果不加 nohup 无论程序在不在后台执行当执行 logout 退出后服务就不存在了,即程序作为子进程伴随着用户父进程被杀死。
运行测试
这里使用了一个常见的网络调试助手,首先建立一个UDP的client连接:
然后,在数据发送窗口输入要发送的数据,点击“发送数据”就可以看到完美的数据了,233333
这里,我默认开启了解析转发数据,但是这其实不会影响到数据在客户端的呈现除非数据字节小于6,如下:
再来看看,服务器这边的log信息,在同一目录下执行:
vim ser_message.log
可以看到,底下的两个数据都是一堆???,这是因为程序中使用的utf8的编码方式,而我的网络调试助手是Unicode编码的,上面的第一天可以看到一个采用utf8格式的数据。
大概就这么多吧,感觉log信息输出到文件这个功能还是很不错的,服务器什么时候接受了什么数据一目了然,当然大家根据自己的需求编写程序实现特定功能吧~
最最最最后,欢迎小伙伴们交流,一起学习
转载请注明出处
- NB-IoT使用笔记(3)在linux下使用python搭建UDP服务
- NB-IoT使用笔记(6)在linux下使用搭建CoAP服务(2)
- NB-IoT使用笔记(4)在linux下使用搭建CoAP服务
- NB-IoT使用笔记(5)在linux下用python搭建UDP转发服务器扩展NB可访问IP个数
- NB-IoT使用笔记(2)实现UDP访问DNS服务获取IP地址(2)
- NB-IoT使用笔记(1)实现UDP访问DNS服务获取IP地址
- NB-IoT使用场景
- NB-IOT使用小结
- NB-IoT和LoRa使用的频谱
- 使用node搭建UDP,TCP,HTTP服务
- 基于Python-ChatterBot搭建不同adapter的聊天机器人(使用NB进行场景分类)
- 基于Python-ChatterBot搭建不同adapter的聊天机器人(使用NB进行场景分类)
- 在Linux下使用subversion搭建项目
- NB-IOT基础模型搭建思路
- 如何在Linux使用Eclipse +&nb…
- 3GPP窄带物联网(NB-IoT)入门手册
- nb-iot
- 使用OpenVPN搭建Linux下的VPN服务
- linux--数据结构
- 程序中错误量的估算--测试、捞鱼问题
- 【学习笔记】计算机网络-DNS层次查询
- CCF试题 201703-1 小明分蛋糕
- 再谈迭代器,生成器,yield,及和类的使用
- NB-IoT使用笔记(3)在linux下使用python搭建UDP服务
- 我的第二个div布局
- 常数变易法
- Could not find com.android.tools.build:gradle:3.0.0.
- 五子棋 人机对弈
- 【NOIP2017提高A组集训10.25】吃草
- HTML
- 2016CCPC杭州站 C
- Python学习--定义函数及参数传值