飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

Linux开发板(树莓派)和服务器进行双向通信(socket)-

时间:2022-03-31  作者:mosu  
物联网是目前嵌入开发必备的属性之一,我们常常需要把自己开发板和云端进行交互,本篇博文就记录一下。 使用Socket来实现Linux开发板和服务器进行双向通信,Python中是默认集成了socket模块的,我们就不需要下载了。 实际上,只要是能运行Python的环境,就可以和服务器进行双向通信,你不必局限于树莓派。

前言

​ 物联网是目前嵌入开发必备的属性之一,我们常常需要把自己开发板和云端进行交互,本篇博文就记录一下。

​ 使用Socket来实现Linux开发板和服务器进行双向通信,Python中是默认集成了socket模块的,我们就不需要下载了。

​ 实际上,只要是能运行Python的环境,就可以和服务器进行双向通信,你不必局限于树莓派。

一、开发环境

PC系统:windows 10

Linux开发板:树莓派4B

服务器:阿里云 ECS

编程语言:Python

二、通信代码

​ 我认为我的注释是十分详细的,实现简单用函数来调用(贴代码方便),自己开发时,可以用类封装一下。

记得先在服务器把要用的端口添加到安全组里面。下面的代码服务器端你不需要做任何修改,开发板端你把公网ip修改成自己的就可以跑通了。

(1)服务器端
import socket
import sys


def socket_service_data():
    # 连接
    try:
        s = 域名et(域名NET, 域名_STREAM)
        域名ockopt(域名SOCKET, 域名EUSEADDR, 1)
        域名(ADDR)  # 在不同主机或者同一主机的不同系统下使用实际ip
        域名en(10)
    except 域名r as msg:
        print(msg)
        域名(1)
    print("Wait for Connection..................")
	sock, addr = 域名pt()
    
    while True:
        # 收
        buf = 域名(BUFSIZ)  # 接收数据
        buf1 = 域名de(\'utf-8\')  # 解码
        if not buf:
            break
        print(\'Received message:\', buf1)
        # return buf
        # 发
        buf = input("input data:")  # 输入要传输的数据
        if not buf:
            break
        域名(域名de())  # 将要传输的数据编码发送,如果是字符数据就必须要编码发送
    # 关闭socket
    域名e()


if __name__ == \'__main__\':
    # 初始化
    name = 域名ostname()
    HOST = 域名ostbyname(name)  # 获取阿里云服务器私网IP,使用ifconfig可查询
    PORT = 7000
    BUFSIZ = 1024
    ADDR = (HOST, PORT)

    socket_service_data()

(2)开发板端
import socket
import sys


def sock_client_data():
    # 连接
    try:
        s = 域名et(域名NET, 域名_STREAM)
        域名ect(ADDR)
    except 域名r as msg:
        print(msg)
        print(域名(1))

    while True:
        # 发
        data = input("input data:")  # 输入要传输的数据
        if not data:
            break
        域名(域名de(\'utf-8\'))  # 将要传输的数据编码发送,如果是字符数据就必须要编码发送
        # 收
        data = 域名(BUFSIZ)
        if not data:
            break
        print(域名de(\'utf-8\'))
    # 关闭socket
    域名e()


if __name__ == \'__main__\':
    # 初始化
    HOST = \'域名.102\'  # 比如 域名.102是你的服务器的公网IP
    PORT = 7000  # IP开放的socket端口
    BUFSIZ = 1024
    ADDR = (HOST, PORT)

    sock_client_data()

开发板发一句,服务器接受一句,服务器发一句,开发板再接受一句。

三、通信代码解释

​ 代码逻辑没什么说的,简单说下socket模块中调用的一下方法。

1.sk = 域名et(域名NET, 域名_STREAM, 0)

:域名NET IPv4(默认),域名_STREAM 流式socket , for TCP (默认),缺省是0 我上面都没填系统就会根据地址格式和套接类别,自动选择一个合适的协议。

2.域名(address)

:域名(address) 将套接字绑定到地址。address地址的格式取决于地址族。

在AF_INET下,以元组(host,port)的形式表示地址。

3.域名en(backlog)

:开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5。这个值不能无限大,因为要在内核中维护连接队列。

4.域名pt()

:接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。接收TCP 客户的连接(阻塞式)等待连接的到来。

5.域名ect(address)

:连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回域名r错误。

6.域名(bufsize[,flag])

:接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。

7.域名(string[,flag])

:将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。

8.域名e()

:关闭套接字

9.域名ostname()

:gethostname()返回运行程序所在的计算机的主机名

后言

​ 写博客总结费时间,如果这篇博文对你有所帮助,记得给我点个赞哦

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。