| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  | # This example code is in the Public Domain (or CC0 licensed, at your option.) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Unless required by applicable law or agreed to in writing, this | 
					
						
							|  |  |  | # software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | 
					
						
							|  |  |  | # CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 10:49:01 +08:00
										 |  |  | from __future__ import print_function, unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  | import os | 
					
						
							|  |  |  | import re | 
					
						
							|  |  |  | import socket | 
					
						
							| 
									
										
										
										
											2021-01-26 10:49:01 +08:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 10:49:01 +08:00
										 |  |  | import ttfw_idf | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # -----------  Config  ---------- | 
					
						
							|  |  |  | PORT = 3333 | 
					
						
							|  |  |  | INTERFACE = 'eth0' | 
					
						
							|  |  |  | # ------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def udp_client(address, payload): | 
					
						
							|  |  |  |     for res in socket.getaddrinfo(address, PORT, socket.AF_UNSPEC, | 
					
						
							|  |  |  |                                   socket.SOCK_DGRAM, 0, socket.AI_PASSIVE): | 
					
						
							|  |  |  |         family_addr, socktype, proto, canonname, addr = res | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         sock = socket.socket(family_addr, socket.SOCK_DGRAM) | 
					
						
							| 
									
										
										
										
											2021-06-21 15:59:57 +02:00
										 |  |  |         sock.settimeout(20.0) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |     except socket.error as msg: | 
					
						
							| 
									
										
										
										
											2021-06-21 15:59:57 +02:00
										 |  |  |         print('Could not create socket') | 
					
						
							|  |  |  |         print(os.strerror(msg.errno)) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |         raise | 
					
						
							|  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2020-11-11 11:31:17 +08:00
										 |  |  |         sock.sendto(payload.encode(), addr) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |         reply, addr = sock.recvfrom(128) | 
					
						
							|  |  |  |         if not reply: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         print('Reply[' + addr[0] + ':' + str(addr[1]) + '] - ' + str(reply)) | 
					
						
							| 
									
										
										
										
											2021-06-21 15:59:57 +02:00
										 |  |  |     except socket.timeout: | 
					
						
							|  |  |  |         print('Socket operation timeout') | 
					
						
							|  |  |  |         return str(None) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |     except socket.error as msg: | 
					
						
							| 
									
										
										
										
											2021-06-21 15:59:57 +02:00
										 |  |  |         print('Error while sending or receiving data from the socket') | 
					
						
							|  |  |  |         print(os.strerror(msg.errno)) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |         sock.close() | 
					
						
							|  |  |  |         raise | 
					
						
							| 
									
										
										
										
											2020-11-11 11:31:17 +08:00
										 |  |  |     return reply.decode() | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-25 15:20:30 +05:30
										 |  |  | @ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') | 
					
						
							| 
									
										
										
										
											2020-12-23 10:15:27 +01:00
										 |  |  | def test_examples_protocol_socket_udpserver(env, extra_data): | 
					
						
							| 
									
										
										
										
											2021-01-26 10:49:01 +08:00
										 |  |  |     MESSAGE = 'Data to ESP' | 
					
						
							| 
									
										
										
										
											2021-06-21 15:59:57 +02:00
										 |  |  |     MAX_RETRIES = 3 | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     steps: | 
					
						
							|  |  |  |       1. join AP | 
					
						
							|  |  |  |       2. have the board connect to the server | 
					
						
							|  |  |  |       3. send and receive data | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2021-01-26 10:49:01 +08:00
										 |  |  |     dut1 = env.get_dut('udp_server', 'examples/protocols/sockets/udp_server', dut_class=ttfw_idf.ESP32DUT) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |     # check and log bin size | 
					
						
							| 
									
										
										
										
											2021-01-26 10:49:01 +08:00
										 |  |  |     binary_file = os.path.join(dut1.app.binary_path, 'udp_server.bin') | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |     bin_size = os.path.getsize(binary_file) | 
					
						
							| 
									
										
										
										
											2021-01-26 10:49:01 +08:00
										 |  |  |     ttfw_idf.log_performance('udp_server_bin_size', '{}KB'.format(bin_size // 1024)) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # start test | 
					
						
							|  |  |  |     dut1.start_app() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 10:49:01 +08:00
										 |  |  |     ipv4 = dut1.expect(re.compile(r' IPv4 address: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)'), timeout=30)[0] | 
					
						
							| 
									
										
										
										
											2020-05-11 08:20:43 +02:00
										 |  |  |     ipv6_r = r':'.join((r'[0-9a-fA-F]{4}',) * 8)    # expect all 8 octets from IPv6 (assumes it's printed in the long form) | 
					
						
							|  |  |  |     ipv6 = dut1.expect(re.compile(r' IPv6 address: ({})'.format(ipv6_r)), timeout=30)[0] | 
					
						
							| 
									
										
										
										
											2021-01-26 10:49:01 +08:00
										 |  |  |     print('Connected with IPv4={} and IPv6={}'.format(ipv4, ipv6)) | 
					
						
							| 
									
										
										
										
											2021-06-21 15:59:57 +02:00
										 |  |  |     dut1.expect(re.compile(r'Waiting for data'), timeout=10) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # test IPv4 | 
					
						
							| 
									
										
										
										
											2021-06-21 15:59:57 +02:00
										 |  |  |     for _ in range(MAX_RETRIES): | 
					
						
							|  |  |  |         print('Testing UDP on IPv4...') | 
					
						
							|  |  |  |         received = udp_client(ipv4, MESSAGE) | 
					
						
							|  |  |  |         if received == MESSAGE: | 
					
						
							|  |  |  |             print('OK') | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         raise ValueError('IPv4: Did not receive UDP message after {} retries'.format(MAX_RETRIES)) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |     dut1.expect(MESSAGE) | 
					
						
							| 
									
										
										
										
											2021-06-21 15:59:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |     # test IPv6 | 
					
						
							| 
									
										
										
										
											2021-06-21 15:59:57 +02:00
										 |  |  |     for _ in range(MAX_RETRIES): | 
					
						
							|  |  |  |         print('Testing UDP on IPv6...') | 
					
						
							|  |  |  |         received = udp_client('{}%{}'.format(ipv6, INTERFACE), MESSAGE) | 
					
						
							|  |  |  |         if received == MESSAGE: | 
					
						
							|  |  |  |             print('OK') | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         raise ValueError('IPv6: Did not receive UDP message after {} retries'.format(MAX_RETRIES)) | 
					
						
							| 
									
										
										
										
											2020-03-17 20:30:33 +01:00
										 |  |  |     dut1.expect(MESSAGE) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     if sys.argv[2:]:    # if two arguments provided: | 
					
						
							|  |  |  |         # Usage: example_test.py <server_address> <message_to_send_to_server> | 
					
						
							|  |  |  |         udp_client(sys.argv[1], sys.argv[2]) | 
					
						
							|  |  |  |     else:               # otherwise run standard example test as in the CI | 
					
						
							| 
									
										
										
										
											2020-12-23 10:15:27 +01:00
										 |  |  |         test_examples_protocol_socket_udpserver() |