前言
物联网是目前嵌入开发必备的属性之一,我们常常需要把自己开发板和云端进行交互,本篇博文就记录一下。
使用Socket来实现Linux开发板和服务器进行双向通信,Python中是默认集成了socket模块的,我们就不需要下载了。
实际上,只要是能运行Python的环境,就可以和服务器进行双向通信,你不必局限于树莓派。
一、开发环境
PC系统:windows 10
Linux开发板:树莓派4B
服务器:阿里云 ECS
编程语言:Python
二、通信代码
我认为我的注释是十分详细的,实现简单用函数来调用(贴代码方便),自己开发时,可以用类封装一下。
记得先在服务器把要用的端口添加到安全组里面。下面的代码服务器端你不需要做任何修改,开发板端你把公网ip修改成自己的就可以跑通了。
(1)服务器端
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
45import socket import sys def socket_service_data(): # 连接 try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(ADDR) # 在不同主机或者同一主机的不同系统下使用实际ip s.listen(10) except socket.error as msg: print(msg) sys.exit(1) print("Wait for Connection..................") sock, addr = s.accept() while True: # 收 buf = sock.recv(BUFSIZ) # 接收数据 buf1 = buf.decode('utf-8') # 解码 if not buf: break print('Received message:', buf1) # return buf # 发 buf = input("input data:") # 输入要传输的数据 if not buf: break sock.send(buf.encode()) # 将要传输的数据编码发送,如果是字符数据就必须要编码发送 # 关闭socket sock.close() if __name__ == '__main__': # 初始化 name = socket.gethostname() HOST = socket.gethostbyname(name) # 获取阿里云服务器私网IP,使用ifconfig可查询 PORT = 7000 BUFSIZ = 1024 ADDR = (HOST, PORT) socket_service_data()
(2)开发板端
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
38import socket import sys def sock_client_data(): # 连接 try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(ADDR) except socket.error as msg: print(msg) print(sys.exit(1)) while True: # 发 data = input("input data:") # 输入要传输的数据 if not data: break s.send(data.encode('utf-8')) # 将要传输的数据编码发送,如果是字符数据就必须要编码发送 # 收 data = s.recv(BUFSIZ) if not data: break print(data.decode('utf-8')) # 关闭socket s.close() if __name__ == '__main__': # 初始化 HOST = '99.100.101.102' # 比如 99.100.101.102是你的服务器的公网IP PORT = 7000 # IP开放的socket端口 BUFSIZ = 1024 ADDR = (HOST, PORT) sock_client_data()
开发板发一句,服务器接受一句,服务器发一句,开发板再接受一句。
三、通信代码解释
代码逻辑没什么说的,简单说下socket模块中调用的一下方法。
1.sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
释:socket.AF_INET IPv4(默认),socket.SOCK_STREAM 流式socket , for TCP (默认),缺省是0 我上面都没填系统就会根据地址格式和套接类别,自动选择一个合适的协议。
2.sk.bind(address)
释:s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。
在AF_INET下,以元组(host,port)的形式表示地址。
3.sk.listen(backlog)
释:开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5。这个值不能无限大,因为要在内核中维护连接队列。
4.sk.accept()
释:接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。接收TCP 客户的连接(阻塞式)等待连接的到来。
5.sk.connect(address)
释:连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
6.sk.recv(bufsize[,flag])
释:接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。
7.sk.send(string[,flag])
释:将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。
8.sk.close()
释:关闭套接字
9.socket.gethostname()
释:gethostname()返回运行程序所在的计算机的主机名
后言
写博客总结费时间,如果这篇博文对你有所帮助,记得给我点个赞哦????
参考文章链接
树莓派4B和阿里云服务器进行通信
网络编程-Python的socket库
最后
以上就是重要墨镜最近收集整理的关于Linux开发板(树莓派)和服务器进行双向通信(socket)的全部内容,更多相关Linux开发板(树莓派)和服务器进行双向通信(socket)内容请搜索靠谱客的其他文章。
发表评论 取消回复