Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:fffc9412550a, 2021-10-10 (annotated)
- Committer:
- Hiroaki_Okoshi
- Date:
- Sun Oct 10 15:06:21 2021 +0000
- Revision:
- 0:fffc9412550a
Please note this repository is no longer maintained by u-blox.; ; "# mbed-os-example-odinw2-wifi-ap-udp-echo"
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Hiroaki_Okoshi | 0:fffc9412550a | 1 | /* WiFi AP Example |
Hiroaki_Okoshi | 0:fffc9412550a | 2 | * Copyright (c) 2018 ARM Limited |
Hiroaki_Okoshi | 0:fffc9412550a | 3 | * |
Hiroaki_Okoshi | 0:fffc9412550a | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
Hiroaki_Okoshi | 0:fffc9412550a | 5 | * you may not use this file except in compliance with the License. |
Hiroaki_Okoshi | 0:fffc9412550a | 6 | * You may obtain a copy of the License at |
Hiroaki_Okoshi | 0:fffc9412550a | 7 | * |
Hiroaki_Okoshi | 0:fffc9412550a | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
Hiroaki_Okoshi | 0:fffc9412550a | 9 | * |
Hiroaki_Okoshi | 0:fffc9412550a | 10 | * Unless required by applicable law or agreed to in writing, software |
Hiroaki_Okoshi | 0:fffc9412550a | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
Hiroaki_Okoshi | 0:fffc9412550a | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
Hiroaki_Okoshi | 0:fffc9412550a | 13 | * See the License for the specific language governing permissions and |
Hiroaki_Okoshi | 0:fffc9412550a | 14 | * limitations under the License. |
Hiroaki_Okoshi | 0:fffc9412550a | 15 | */ |
Hiroaki_Okoshi | 0:fffc9412550a | 16 | |
Hiroaki_Okoshi | 0:fffc9412550a | 17 | #include "mbed.h" |
Hiroaki_Okoshi | 0:fffc9412550a | 18 | #include "OdinWiFiInterface.h" |
Hiroaki_Okoshi | 0:fffc9412550a | 19 | #include <string> |
Hiroaki_Okoshi | 0:fffc9412550a | 20 | |
Hiroaki_Okoshi | 0:fffc9412550a | 21 | #ifdef DEVICE_WIFI_AP |
Hiroaki_Okoshi | 0:fffc9412550a | 22 | static const char *wifi_ssid = MBED_CONF_APP_WIFI_SSID; |
Hiroaki_Okoshi | 0:fffc9412550a | 23 | static const char *wifi_password = MBED_CONF_APP_WIFI_PASSWORD; |
Hiroaki_Okoshi | 0:fffc9412550a | 24 | static const char *ap_ip = MBED_CONF_APP_AP_IP; |
Hiroaki_Okoshi | 0:fffc9412550a | 25 | static const char *ap_netmask = MBED_CONF_APP_AP_NETMASK; |
Hiroaki_Okoshi | 0:fffc9412550a | 26 | static const char *ap_gateway = MBED_CONF_APP_AP_GATEWAY; |
Hiroaki_Okoshi | 0:fffc9412550a | 27 | #endif |
Hiroaki_Okoshi | 0:fffc9412550a | 28 | |
Hiroaki_Okoshi | 0:fffc9412550a | 29 | #define ECHO_SERVER_PORT 5050 |
Hiroaki_Okoshi | 0:fffc9412550a | 30 | |
Hiroaki_Okoshi | 0:fffc9412550a | 31 | #define UDP_CLIENT_ADDR "10.0.0.10" |
Hiroaki_Okoshi | 0:fffc9412550a | 32 | #define UDP_CLIENT_PORT 5050 |
Hiroaki_Okoshi | 0:fffc9412550a | 33 | |
Hiroaki_Okoshi | 0:fffc9412550a | 34 | OdinWiFiInterface *_wifi; |
Hiroaki_Okoshi | 0:fffc9412550a | 35 | |
Hiroaki_Okoshi | 0:fffc9412550a | 36 | static void start_ap(nsapi_security_t security = NSAPI_SECURITY_WPA_WPA2) |
Hiroaki_Okoshi | 0:fffc9412550a | 37 | { |
Hiroaki_Okoshi | 0:fffc9412550a | 38 | nsapi_error_t error_code; |
Hiroaki_Okoshi | 0:fffc9412550a | 39 | |
Hiroaki_Okoshi | 0:fffc9412550a | 40 | printf("\nStarting AP\n"); |
Hiroaki_Okoshi | 0:fffc9412550a | 41 | |
Hiroaki_Okoshi | 0:fffc9412550a | 42 | // AP Configure and start |
Hiroaki_Okoshi | 0:fffc9412550a | 43 | error_code = _wifi->set_ap_network(ap_ip, ap_netmask, ap_gateway); |
Hiroaki_Okoshi | 0:fffc9412550a | 44 | MBED_ASSERT(error_code == NSAPI_ERROR_OK); |
Hiroaki_Okoshi | 0:fffc9412550a | 45 | |
Hiroaki_Okoshi | 0:fffc9412550a | 46 | //DHCP not available |
Hiroaki_Okoshi | 0:fffc9412550a | 47 | error_code = _wifi->set_ap_dhcp(false); |
Hiroaki_Okoshi | 0:fffc9412550a | 48 | MBED_ASSERT(error_code == NSAPI_ERROR_OK); |
Hiroaki_Okoshi | 0:fffc9412550a | 49 | |
Hiroaki_Okoshi | 0:fffc9412550a | 50 | //Set beacon interval to default value |
Hiroaki_Okoshi | 0:fffc9412550a | 51 | _wifi->set_ap_beacon_interval(100); |
Hiroaki_Okoshi | 0:fffc9412550a | 52 | |
Hiroaki_Okoshi | 0:fffc9412550a | 53 | //Set ap ssid, password and channel |
Hiroaki_Okoshi | 0:fffc9412550a | 54 | error_code = _wifi->ap_start(wifi_ssid, wifi_password, security, cbWLAN_CHANNEL_01); |
Hiroaki_Okoshi | 0:fffc9412550a | 55 | MBED_ASSERT(error_code == NSAPI_ERROR_OK); |
Hiroaki_Okoshi | 0:fffc9412550a | 56 | |
Hiroaki_Okoshi | 0:fffc9412550a | 57 | printf("\nAP started successfully\n"); |
Hiroaki_Okoshi | 0:fffc9412550a | 58 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 59 | |
Hiroaki_Okoshi | 0:fffc9412550a | 60 | |
Hiroaki_Okoshi | 0:fffc9412550a | 61 | static void stop_ap() |
Hiroaki_Okoshi | 0:fffc9412550a | 62 | { |
Hiroaki_Okoshi | 0:fffc9412550a | 63 | nsapi_error_t error_code; |
Hiroaki_Okoshi | 0:fffc9412550a | 64 | |
Hiroaki_Okoshi | 0:fffc9412550a | 65 | error_code = _wifi->ap_stop(); |
Hiroaki_Okoshi | 0:fffc9412550a | 66 | MBED_ASSERT(error_code == NSAPI_ERROR_OK); |
Hiroaki_Okoshi | 0:fffc9412550a | 67 | |
Hiroaki_Okoshi | 0:fffc9412550a | 68 | printf("\nAP stopped\n"); |
Hiroaki_Okoshi | 0:fffc9412550a | 69 | |
Hiroaki_Okoshi | 0:fffc9412550a | 70 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 71 | |
Hiroaki_Okoshi | 0:fffc9412550a | 72 | int main() |
Hiroaki_Okoshi | 0:fffc9412550a | 73 | { |
Hiroaki_Okoshi | 0:fffc9412550a | 74 | nsapi_size_or_error_t errcode; |
Hiroaki_Okoshi | 0:fffc9412550a | 75 | nsapi_error_t *err; |
Hiroaki_Okoshi | 0:fffc9412550a | 76 | UDPSocket sock; |
Hiroaki_Okoshi | 0:fffc9412550a | 77 | SocketAddress sockAddr; |
Hiroaki_Okoshi | 0:fffc9412550a | 78 | int n = 0; |
Hiroaki_Okoshi | 0:fffc9412550a | 79 | char recv_buf[1024]; |
Hiroaki_Okoshi | 0:fffc9412550a | 80 | |
Hiroaki_Okoshi | 0:fffc9412550a | 81 | /* Version Info */ |
Hiroaki_Okoshi | 0:fffc9412550a | 82 | printf("Mbed OS version %d.%d.%d\r\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION); |
Hiroaki_Okoshi | 0:fffc9412550a | 83 | |
Hiroaki_Okoshi | 0:fffc9412550a | 84 | /*Start AP*/ |
Hiroaki_Okoshi | 0:fffc9412550a | 85 | _wifi = new OdinWiFiInterface(true); |
Hiroaki_Okoshi | 0:fffc9412550a | 86 | start_ap(); |
Hiroaki_Okoshi | 0:fffc9412550a | 87 | |
Hiroaki_Okoshi | 0:fffc9412550a | 88 | /*Socket initialization*/ |
Hiroaki_Okoshi | 0:fffc9412550a | 89 | errcode = sock.open(_wifi); |
Hiroaki_Okoshi | 0:fffc9412550a | 90 | if (errcode != NSAPI_ERROR_OK) { |
Hiroaki_Okoshi | 0:fffc9412550a | 91 | printf("UDPSocket.open() fails, code: %d\n", errcode); |
Hiroaki_Okoshi | 0:fffc9412550a | 92 | return -1; |
Hiroaki_Okoshi | 0:fffc9412550a | 93 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 94 | |
Hiroaki_Okoshi | 0:fffc9412550a | 95 | errcode = sock.bind(ap_ip, ECHO_SERVER_PORT); |
Hiroaki_Okoshi | 0:fffc9412550a | 96 | if (errcode < 0) { |
Hiroaki_Okoshi | 0:fffc9412550a | 97 | printf("UDPSocket.connect() fails, code: %d\n", errcode); |
Hiroaki_Okoshi | 0:fffc9412550a | 98 | return -1; |
Hiroaki_Okoshi | 0:fffc9412550a | 99 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 100 | else { |
Hiroaki_Okoshi | 0:fffc9412550a | 101 | printf("UDP: connected with %s server\n", ap_ip); |
Hiroaki_Okoshi | 0:fffc9412550a | 102 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 103 | |
Hiroaki_Okoshi | 0:fffc9412550a | 104 | /*Echo server*/ |
Hiroaki_Okoshi | 0:fffc9412550a | 105 | |
Hiroaki_Okoshi | 0:fffc9412550a | 106 | /* |
Hiroaki_Okoshi | 0:fffc9412550a | 107 | Since, unlike TCP, UDP is connectionless, so server |
Hiroaki_Okoshi | 0:fffc9412550a | 108 | must know the address of client as well as the port |
Hiroaki_Okoshi | 0:fffc9412550a | 109 | it is listening on in order to reach it |
Hiroaki_Okoshi | 0:fffc9412550a | 110 | */ |
Hiroaki_Okoshi | 0:fffc9412550a | 111 | sockAddr.set_ip_address(UDP_CLIENT_ADDR); |
Hiroaki_Okoshi | 0:fffc9412550a | 112 | sockAddr.set_port(UDP_CLIENT_PORT); |
Hiroaki_Okoshi | 0:fffc9412550a | 113 | |
Hiroaki_Okoshi | 0:fffc9412550a | 114 | while (1) { |
Hiroaki_Okoshi | 0:fffc9412550a | 115 | n = sock.recv((void*) recv_buf, sizeof(recv_buf)); |
Hiroaki_Okoshi | 0:fffc9412550a | 116 | if (n > 0) |
Hiroaki_Okoshi | 0:fffc9412550a | 117 | { |
Hiroaki_Okoshi | 0:fffc9412550a | 118 | printf("\n Received from client %d bytes: %s \n", n, recv_buf); |
Hiroaki_Okoshi | 0:fffc9412550a | 119 | |
Hiroaki_Okoshi | 0:fffc9412550a | 120 | errcode = sock.sendto(sockAddr, (void*) recv_buf, n); |
Hiroaki_Okoshi | 0:fffc9412550a | 121 | if (errcode < 0) |
Hiroaki_Okoshi | 0:fffc9412550a | 122 | { |
Hiroaki_Okoshi | 0:fffc9412550a | 123 | printf("\n UDPSocket.sendto() fails, code: %d\n", errcode); |
Hiroaki_Okoshi | 0:fffc9412550a | 124 | break; |
Hiroaki_Okoshi | 0:fffc9412550a | 125 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 126 | else |
Hiroaki_Okoshi | 0:fffc9412550a | 127 | { |
Hiroaki_Okoshi | 0:fffc9412550a | 128 | printf("\n UDP: Sent %d Bytes to client\n", n); |
Hiroaki_Okoshi | 0:fffc9412550a | 129 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 130 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 131 | else |
Hiroaki_Okoshi | 0:fffc9412550a | 132 | { |
Hiroaki_Okoshi | 0:fffc9412550a | 133 | printf("\n UDPSocket.recv() failed"); |
Hiroaki_Okoshi | 0:fffc9412550a | 134 | break; |
Hiroaki_Okoshi | 0:fffc9412550a | 135 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 136 | } |
Hiroaki_Okoshi | 0:fffc9412550a | 137 | |
Hiroaki_Okoshi | 0:fffc9412550a | 138 | sock.close(); |
Hiroaki_Okoshi | 0:fffc9412550a | 139 | stop_ap(); |
Hiroaki_Okoshi | 0:fffc9412550a | 140 | return 0; |
Hiroaki_Okoshi | 0:fffc9412550a | 141 | } |