这一篇是树莓派与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下的串口模块。我之前做蓝牙时,串口模块已经被安装上了,这里还是贴一下安装命令:
- sudo pip install pyserial
复制代码
或者
- sudo pip3 install pyserial
复制代码
二、测试代码
先将测试代码贴在这里
- import os
- import time
- from multiprocessing import Process
- import serial
- import socketserver
- #TCP Server
- class Myserver(socketserver.BaseRequestHandler):
- def handle(self):
- conn = self.request
- while True:
- uclient_dat=conn.recv(1024)
- print('rcv from 8266:%s' %(str(uclient_dat,'utf8')))
- if(uclient_dat==bytes('liang ge huang li ming cui liu','utf8')):
- conn.sendall(bytes('yi hang bai lu shang qing tian','utf8'))
- else:
- conn.sendall(bytes("I don't know",'utf8'))
- def tcpServer(name):
- print('%s start...' %name)
- userver=socketserver.ThreadingTCPServer(('192.168.43.125',8200),Myserver)
- userver.serve_forever()
- #TCP Client
- def getRSP(ser):
- size=ser.inWaiting()
- sbuf=ser.read(size)
- print(sbuf)
- #1 set to station mode
- #2 set ssid
- #3 chek ip addr
- #4 creat socket
- param=('AT+CWMODE_CUR=1\r\n',
- 'AT+CWJAP_CUR="AP01","12345678"\r\n',
- 'AT+CIPSTA?\r\n',
- 'AT+CIPSTART="TCP","192.168.43.125",8200\r\n')
- def tcpClient8266(name):
- print('%s start...' %name)
- ser=serial.Serial("/dev/ttyAMA0",115200)
- for prm in param:
- ser.write(prm.encode())
- time.sleep(8)
- getRSP(ser)
- dat_tx='liang ge huang li ming cui liu'
- print(len(dat_tx))
- while True:
- ser.write('AT+CIPSENDEX=30\r\n'.encode())
- time.sleep(1)
- getRSP(ser)
- ser.write(dat_tx.encode())
- time.sleep(1)
- getRSP(ser)
- if __name__=='__main__':
- p1=Process(target=tcpServer,args=('tcpServer',))
- p2=Process(target=tcpClient8266,args=('tcpClient8266',))
- p1.start()
- p2.start()
- while True:
- 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接口也可以直接挂载传感器模块获取相应的传感器数据。后续将继续在这方面拓展做一些有意思的小应用。
本文来自论坛,点击查看完整帖子内容。