完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.工程准备
由于要使用wifi功能,直接从wlan_demo复制一份出来,然后修改。 源文件只留下 main.c 就可以了。 BUILD.gn文件 #include #include #include #include "ohos_init.h" #include "driver/chip/hal_gpio.h"; #include "kernel/os/os.h"; #include “wifi_device.h” #include "cjson/cJSON.h"; #include "net/ping/ping.h"; #include "net/lwip-2.1.2/lwip/sockets.h"; #include "net/lwip-2.1.2/lwip/tcp.h"; #include "net/lwip-2.1.2/lwip/inet.h"; #include "net/lwip-2.1.2/lwip/ip_addr.h"; #define WIFI_DEVICE_CONNECT_AP_SSID "ChinaNet-111"; #define WIFI_DEVICE_CONNECT_AP_PSK " 111666111” #define GPIO_OUTPUT_PORT GPIO_PORT_A 静态 OS_Thread_t g_main_thread; 静态无效 gpio_output_init(void) { GPIO_InitParam 参数; param.driving = GPIO_DRIVING_LEVEL_1; param.mode = GPIOx_Pn_F1_OUTPUT; param.pull = GPIO_PULL_NONE; HAL_GPIO_Init(GPIO_OUTPUT_PORT, GPIO_PIN_21, ¶m);//led灯对应IO } static void gpio_output_ctl(uint8_t level) { HAL_GPIO_WritePin(GPIO_OUTPUT_PORT, GPIO_PIN_21, level ? GPIO_PIN_HIGH : GPIO_PIN_LOW); } void wifi_connect(void) { const char ssid_want_connect[] = WIFI_DEVICE_CONNECT_AP_SSID; const char psk[] = WIFI_DEVICE_CONNECT_AP_PSK; printf("n============ 连接测试开始 ============n"); if (WIFI_SUCCESS != EnableWifi()) { printf(“错误:EnableWifi 失败。n”); 返回; } printf("启用Wifi 成功。n"); if (WIFI_STA_ACTIVE == IsWifiActive()) printf("Wifi is active.n"); OS_Sleep(1); if (WIFI_SUCCESS != Scan()) { printf("错误:扫描失败。n"); 返回; } printf("Wifi 扫描成功。n"); OS_Sleep(1); WifiScanInfo scan_results[30]; 无符号整数 scan_num = 30; if (WIFI_SUCCESS != GetScanInfoList(scan_results, &scan_num)) { printf("Error: GetScanInfoList failed.n"); 返回; } WifiDeviceConfig 配置 = { 0 }; int netId = 0; 国际我; for (i = 0; i < scan_num; i++) { if (0 == strcmp(scan_results .ssid, ssid_want_connect)) { memcpy(config.ssid, scan_results .ssid, WIFI_MAX_SSID_LEN); memcpy(config.bssid, scan_results .bssid, WIFI_MAC_LEN); strcpy(config.preSharedKey, psk); config.securityType = scan_results .securityType; config.wapiPskType = WIFI_PSK_TYPE_ASCII; config.freq = scan_results .frequency; 休息; } } if (i >= scan_num) { printf("Error: No found ssid in scan_resultsn"); 返回; } printf("GetScanInfoList 成功。n"); if (WIFI_SUCCESS != AddDeviceConfig(&config, &netId)) { printf("Error: AddDeviceConfig Failn"); 返回; } printf("AddDeviceConfig 成功。n"); if (WIFI_SUCCESS != ConnectTo(netId)) { printf("Error: ConnectTo Failn"); } printf("连接成功n"); OS_Sleep(3); WifiLinkedInfo get_linked_res; if (WIFI_SUCCESS != GetLinkedInfo(&get_linked_res)) { printf("Error: GetLinkedInfo Failn"); 返回; } printf("GetLinkedInfo 成功。n"); printf("ssid: %sn", get_linked_res.ssid); printf("bssid:"); for (int j = 0; j < WIFI_MAC_LEN; j++) { printf("%02X", get_linked_res.bssid[j]); } printf("n"); printf("rssi: %dn", get_linked_res.rssi); if (WIFI_SUCCESS != GetDeviceMacAddress(get_mac_res)) { printf("Error: GetDeviceMacAddress Failn"); 返回; } printf("GetDeviceMacAddress 成功。n"); for (int j = 0; j < WIFI_MAC_LEN - 1; j++) { printf("%02X:", get_mac_res[j]); } printf("%02Xn", get_mac_res[WIFI_MAC_LEN - 1]); } struct ping_data ping_t; //ping 命令参数设置 void ping_init() { ip_addr_t server_ip; inet_aton(“129.204.63.27”, &server_ip); ping_t.sin_addr = server_ip; ping_t.count = 0xF; ping_t.data_long = 512; ping_t.timeout = 30; ping_t.run_flag = 1; } //TCP SOCKET int s; void tcp_test_init() { //套接字创建! s = 套接字(AF_INET,SOCK_STREAM,IPPROTO_TCP); //地址信息! 结构 sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(5679); inet_pton(AF_INET, “192.168.1.100”, &server_addr.sin_addr); //连接! if(connect(s,(void *)&server_addr,sizeof(server_addr)) < 0) { printf("connect tcp_server failed!rn"); } 别的 { printf("连接tcp_server成功!rn"); } // 发送数据 send(s, "xr806n", 7, 0); } static void MainThread(void *arg) { gpio_output_init(); wifi_connect(); ping_init(); 平(&ping_t); tcp_test_init(); 字符缓冲区[32]; int cnt = 0; while(1) { sprintf(buf,"XR806:%s : %d rn",cJSON_Version(), cnt++); //向服务器发送数据 send(s,buf, sizeof(buf), 0); printf("%s:Hello XR806 rn",__func__); gpio_output_ctl(1); OS_Sleep(1); gpio_output_ctl(0); OS_Sleep(1); } } void WifiTestMain(void) { printf("Wifi Test Startrn"); if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL, OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) { printf("[ERR]创建主线程失败n"); } } SYS_RUN(WifiTestMain); 2. XR806 SDK 仔细看下xr806工程库的结构, xr806的xr_skylark路径下是原生驱动库! 该路径下面有各种功能参考示例,如trustzone、net、ping、json等。 因此,直接参考xr_skylark包括下的内容,来实现一些简单的功能 3.实现的功能 0)连接WiFi; 根据自己的SSID和PSK修改,代码直接复制原来的。 1)ping服务器,进行联通性测试; ping一下自己的服务,根据需要进行修改。 包括下面有ping/ping.h文件。很简单的一个结构体(如下所示),看情况就是给一个地址,设置一下参数,然后就可以实现ping命令的功能了。 2)作为TCP客户端,连接服务器,发数据; 通过TCP连接服务器,发数据。 设置服务器信息 【地址】(比如:192.168.1.100) 【端口号】(比如5679) 净路径下面有LWIP库,借自体实现网络通信功能。 代码里,通过宏定义的方式,将lwip_xxx改成了与linux下的soket API一样的接口。 参考正常的TCP_Client程序就行了 3)读取一下xr_skylark里的cjson版本信息。 发现有cjson库,然后就随便测试一下。 4.程序示例 param.driving = GPIO_DRIVING_LEVEL_1; param.mode = GPIOx_Pn_F1_OUTPUT; param.pull = GPIO_PULL_NONE; HAL_GPIO_Init(GPIO_OUTPUT_PORT, GPIO_PIN_21, ¶m);//led灯对应IO } static void gpio_output_ctl(uint8_t level) { HAL_GPIO_WritePin(GPIO_OUTPUT_PORT, GPIO_PIN_21, level ? GPIO_PIN_HIGH : GPIO_PIN_LOW); } void wifi_connect(void) { const char ssid_want_connect[] = WIFI_DEVICE_CONNECT_AP_SSID; const char psk[] = WIFI_DEVICE_CONNECT_AP_PSK; printf("n============连接测试开始============n"); if (WIFI_SUCCESS != EnableWifi()) { printf("错误:EnableWifi 失败。n"); 返回; } printf("启用Wifi 成功。n"); if (WIFI_STA_ACTIVE == IsWifiActive()) printf("Wifi 处于活动状态。n"); OS_Sleep(1); if (WIFI_SUCCESS != Scan()) { printf("错误:扫描失败。n"); 返回; } printf("wifi 扫描成功。n"); OS_Sleep(1); WifiScanInfo scan_results[30]; 无符号整数 scan_num = 30; if (WIFI_SUCCESS != GetScanInfoList(scan_results, &scan_num)) { printf("错误:GetScanInfoList 失败。n"); 返回; } WifiDeviceConfig 配置 = { 0 }; int netId = 0; 国际我; for (i = 0; i < scan_num; i++) { if (0 == strcmp(scan_results.ssid, ssid_want_connect)) { memcpy(config.ssid, scan_results.ssid, WIFI_MAX_SSID_LEN); memcpy(config.bssid, scan_results.bssid, WIFI_MAC_LEN); strcpy(config.preSharedKey, psk); config.securityType = scan_results.securityType; config.wapiPskType = WIFI_PSK_TYPE_ASCII; config.freq = scan_results.frequency; 休息; } } if (i >= scan_num) { printf("错误:在 scan_results 中没有找到 ssidn"); 返回; } printf("GetScanInfoList 成功。n"); if (WIFI_SUCCESS != AddDeviceConfig(&config, &netId)) { printf("Error: AddDeviceConfig Failn"); 返回; } printf("添加设备配置成功。n"); if (WIFI_SUCCESS != ConnectTo(netId)) { printf("Error: ConnectTo Failn"); 返回; 5.结果展示 通过网络调试工具,建立TCP服务器,接收到xr806发来的数据。 打印信息 [net INF] netif (IPv4) is up [net INF] address: 192.168.1.110 [net INF] gateway: 192.168.1.1 [net INF] netmask: 255.255.255.0 [net INF] msg GetLinkedInfo 成功。 ssid:ChinaNet-111 bssid:5475956E3374 rssi:110 GetDeviceMacAddress 成功。 9C:9E:49:BA:5B:01 PING 129.204.63.27 520 字节数据。 对于icmp_seq请求超时= 1个 从129.204.63.27 512字节:icmp_seq = 2时间= 43毫秒 512个字节从129.204.63.27:icmp_seq = 3时间= 43毫秒 512个字节从129.204.63.27:icmp_seq = 4时间= 44毫秒 的512字节来自 129.204.63.27:icmp_seq=5 time=43 ms 来自 129.204.63.27 的 512 字节:icmp_seq=6 time=45 ms 从129.204.63.27 512个字节:icmp_seq = 7时间= 46毫秒 从129.204.63.27 512个字节:icmp_seq = 8时间= 44毫秒 从129.204.63.27 512个字节:icmp_seq = 9时间= 44毫秒 从129.204.63.27 512个字节:icmp_seq = 10时间= 44毫秒 从129.204.63.27 512个字节:icmp_seq = 11时间= 44毫秒 从129.204.63.27 512个字节:icmp_seq = 12时间= 44毫秒 从129.204.63.27 512个字节:icmp_seq = 13时间= 44毫秒 的512字节来自 129.204.63.27:icmp_seq=14 时间=44 ms 来自 129.204.63.27 的 512 字节:icmp_seq=15 时间=43 ms |
|
|
|
只有小组成员才能发言,加入小组>>
2678 浏览 0 评论
为了学习内核开发,大佬手搓了一个轻量级操作系统YiYiYa OS
2627 浏览 0 评论
1248 浏览 0 评论
1385 浏览 0 评论
1196 浏览 0 评论
【开源硬件大赛】基于全志V853设计的全功能BTB学习开发板
3431浏览 8评论
3084浏览 5评论
1858浏览 4评论
全志V85x硬件设计大赛作品精选第二期,快来Pick你心目中的最佳方案
87846浏览 3评论
3594浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 10:21 , Processed in 0.607065 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号