注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
icefire2012的个人空间 https://home.eeworld.com.cn/space-uid-404205.html [收藏] [复制] [分享] [RSS]
日志

【树莓派3B+测评】与8266通信

已有 1210 次阅读2018-10-7 14:58 |个人分类:树莓派

        这一篇是树莓派与ESP8266的通信。
        简单的示意图如下:

        手机作为AP,树莓派和ESP8266分别连接到该热点上。这里ESP8266用的是官方的模组,需要外部MCU通过串口发送AT指令控制。那这个MCU就由树莓派代劳了。树莓派和ESP8266之间建立TCP连接,树莓派作为服务器,ESP8266作为客户端。本质就是树莓派自己在这绕着圈子自言自语,呵呵。

一、准备工作
        手机建立AP热点,名称为:AP01,密码为12345678

        树莓派和ESP8266之间需要四根连线。分别是3.3V电源,GND,以及串口的tx和rx。ESP8266所需的电源从树莓派上获取。之前提到过,树莓派的IO扩展口中有路UART,如下图所示。根据树莓派官方的资料,树莓派3B+上的串口控制器默认是分配给了蓝牙,这里要用串口,需要更改配置,将串口分配到IO扩展口上。具体的方法网上有不少,我是参照这个网页上的教程来设置的(http://shumeipai.nxez.com/2016/0 ... art-use-issues.html)。
            

        测试的时候,还是用的python编程,这里需要先安装一下python下的串口模块。我之前做蓝牙时,串口模块已经被安装上了,这里还是贴一下安装命令:
  1. sudo pip install pyserial
复制代码

或者
  1. sudo pip3 install pyserial
复制代码


二、测试代码
        先将测试代码贴在这里
  1. import os
  2. import time
  3. from multiprocessing import Process
  4. import serial
  5. import socketserver

  6. #TCP Server
  7. class Myserver(socketserver.BaseRequestHandler):
  8.     def handle(self):
  9.         conn = self.request
  10.         while True:
  11.             uclient_dat=conn.recv(1024)
  12.             print('rcv from 8266:%s' %(str(uclient_dat,'utf8')))
  13.             if(uclient_dat==bytes('liang ge huang li ming cui liu','utf8')):
  14.                 conn.sendall(bytes('yi hang bai lu shang qing tian','utf8'))
  15.             else:
  16.                 conn.sendall(bytes("I don't know",'utf8'))

  17. def tcpServer(name):
  18.     print('%s start...' %name)
  19.     userver=socketserver.ThreadingTCPServer(('192.168.43.125',8200),Myserver)
  20.     userver.serve_forever()

  21. #TCP Client
  22. def getRSP(ser):
  23.     size=ser.inWaiting()
  24.     sbuf=ser.read(size)
  25.     print(sbuf)

  26. #1 set to station mode
  27. #2 set ssid
  28. #3 chek ip addr
  29. #4 creat socket
  30. param=('AT+CWMODE_CUR=1\r\n',
  31.        'AT+CWJAP_CUR="AP01","12345678"\r\n',
  32.        'AT+CIPSTA?\r\n',
  33.        'AT+CIPSTART="TCP","192.168.43.125",8200\r\n')

  34. def tcpClient8266(name):
  35.     print('%s start...' %name)
  36.     ser=serial.Serial("/dev/ttyAMA0",115200)
  37.     for prm in param:
  38.         ser.write(prm.encode())                                
  39.         time.sleep(8)
  40.         getRSP(ser)
  41.     dat_tx='liang ge huang li ming cui liu'
  42.     print(len(dat_tx))
  43.     while True:
  44.         ser.write('AT+CIPSENDEX=30\r\n'.encode())      
  45.         time.sleep(1)
  46.         getRSP(ser)
  47.         ser.write(dat_tx.encode())      
  48.         time.sleep(1)
  49.         getRSP(ser)

  50. if __name__=='__main__':
  51.     p1=Process(target=tcpServer,args=('tcpServer',))
  52.     p2=Process(target=tcpClient8266,args=('tcpClient8266',))
  53.     p1.start()
  54.     p2.start()
  55.     while True:
  56.         pass
复制代码


三、简要说明
        测试程序启动后,建立了两个进程,tcpServer和tcpClient8266,并分别启动,见代码57-60行。
        进程tcpServer的代码在8-22行,建立的server的ip为192.168.43.125(也就是树莓派的IP),socket端口为8200。此server只做一件事,接收客户端的数据,如果收到的为汉语拼音“两个黄鹂鸣翠柳”,则回复汉语拼音“一行白鹭上青天”,否则回复“I don't know”。
        进程tcpClient8266的代码在25-54行。首先打开串口(line41),串口设备为/dev/ttyAMA0,使用的波特率为115200,其它都用默认配置。然后通过串口发送AT指令配置8266模块。配置的参数param一共有四个,第一个是设置8266为station模式;第二个是设置要连接的热点名称和密码;第三个是获取8266分配到的网络配置信息,包括IP地址,子网掩码,网关等;第四个是建立tcp连接,服务器地址和socket端口就是tcpServer进程中设置的信息。每发送一个配置信息,都会等待8266完成配置,并接收8266返回的配置信息,并打印出来(通过getRSP()函数)。每条配置信息完成的时间不尽相同,这里没有去解析回复信息,简单起见,都做了一个比较长的延时(line44)。建立连接后,就可以通信了。48-54行是在循环发送汉语拼音“两个黄鹂鸣翠柳”,并接收服务器传回来的信息。
最终的演示效果如下:

        手机上的连接示意图如下:第一个是树莓派,第二个是8266,第三个是开发PC机。


四、结语
        在这个例子里,树莓派一方面构建一个web服务器,另外一方面,可以直接挂载其它的物联网模块,这里是用串口和连接了wifi模块,也可以连接433或zigbee模块。如果进一步拓展功能,就能成为一个功能丰富的物联网网关,管理众多的物联网节点。也可以通过IO扩张上的I2C以及SPI接口也可以直接挂载传感器模块获取相应的传感器数据。后续将继续在这方面拓展做一些有意思的小应用。

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章