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


    前言

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

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

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

    一、开发环境

    PC系统:windows 10

    Linux开发板:树莓派4B

    服务器:阿里云 ECS

    编程语言:Python

    二、通信代码

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

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

    (1)服务器端
    import 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)开发板端
    import 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库


    __EOF__

  • 本文作者: Mosu's tech blog
  • 本文链接: https://www.cnblogs.com/mosu/p/16072146.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    依赖的aar包跟项目jdk版本不一致问题
    常用排序算法详解
    B站:李宏毅2020机器学习笔记 5 —— 分类器Classification
    csdn最牛最全的使用python自动发送邮件
    sealos 与其它流行产品的差异与联系
    5--OpenCV:图形绘制与文字输出
    [附源码]java毕业设计汽车租赁系统
    软件外包团队的人员构成
    【linux】进程的概念与控制
    【Python】pyecharts 数据可视化模块
  • 原文地址:https://www.cnblogs.com/mosu/p/16072146.html