【XR806开发板试用】TCP通信测试 Ping 命令测试

news2024/11/24 13:11:06

1.工程准备

由于要使用wifi功能,直接从wlan_demo复制一份出来,然后修改。
源文件只留下 main.c 就可以了。

BUILD.gn文件

import("//device/xradio/xr806/liteos_m/config.gni")

static_library("app_mying") {
   configs = []

   sources = [
      "main.c",
   ]

   cflags = board_cflags

   include_dirs = board_include_dirs
   include_dirs += [
        "//kernel/liteos_m/kernel/arch/include",
        "//utils/native/lite/include",
        "//foundation/communication/wifi_lite/interfaces/wifiservice",
   ]
}

2. XR806 SDK

仔细看下xr806工程库的结构,
xr806的xr_skylark路径下属于芯片原生驱动库!
该路径下面有各种功能参考示例,如trustzone、net、ping、json等。
因此,直接参考xr_skylark\include下的内容,来实现一些简单的功能。

在这里插入图片描述

3.实现的功能

0)连接WiFi;

根据自己的SSID和PSK修改,代码直接copy原来的。

1)ping服务器,进行联通性测试;

ping一下自己的服务器,根据需要进行修改。

include下面有ping/ping.h文件。很简单的一个结构体(如下所示),看情况就是给个地址,设置一下参数,然后就可以实现ping命令的功能了。
struct ping_data {
	ip_addr_t sin_addr; /* server addr */

	u32_t count;        /* number of ping */
	u32_t data_long;    /* the ping packet data long */
	u32_t interval;     /* Wait interval seconds between sending each packet, default 1s */
	u32_t timeout;      /* Time to wait for a response, in seconds */
	u32_t deadline;     /* Specify a timeout, in seconds, ping thread will stop if timeout */
	u32_t ttl;          /* ttl ping only. Set the IP Time to Live. */

	int run_flag;       /* run flag, 0:stop 1:start */
};

s32_t ping(struct ping_data *data);

2)作为TCP客户端,连接server,发数据;

通过TCP连接服务器,发数据。
设置服务器信息
【地址】(比如:192.168.1.100)
【端口号】(比如5679)

net路径下面有lwip库,借此实现网络通信功能。
代码里,通过宏定义的方式,将lwip_xxx改成了与linux下的soket API一样的接口。
参考正常的TCP_Client程序就行了。
在这里插入图片描述

3)读取一下xr_skylark里的cjson版本信息。

发现有cjson库,然后就随便测试一下。    

4.程序示例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#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

static OS_Thread_t g_main_thread;

static void gpio_output_init(void)
{
    GPIO_InitParam param;
    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, &param);//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=========== Connect Test Start ===========\n");

    if (WIFI_SUCCESS != EnableWifi()) {
        printf("Error: EnableWifi fail.\n");
        return;
    }
    printf("EnableWifi Success.\n");

    if (WIFI_STA_ACTIVE == IsWifiActive())
        printf("Wifi is active.\n");

    OS_Sleep(1);

    if (WIFI_SUCCESS != Scan()) {
        printf("Error: Scan fail.\n");
        return;
    }
    printf("Wifi Scan Success.\n");

    OS_Sleep(1);

    WifiScanInfo scan_results[30];
    unsigned int scan_num = 30;

    if (WIFI_SUCCESS != GetScanInfoList(scan_results, &scan_num)) {
        printf("Error: GetScanInfoList fail.\n");
        return;
    }

    WifiDeviceConfig config = { 0 };
    int netId = 0;

    int i;
    for (i = 0; i < scan_num; i++) {
        if (0 == strcmp(scan_results[i].ssid, ssid_want_connect)) {
            memcpy(config.ssid, scan_results[i].ssid,
                   WIFI_MAX_SSID_LEN);
            memcpy(config.bssid, scan_results[i].bssid,
                   WIFI_MAC_LEN);
            strcpy(config.preSharedKey, psk);
            config.securityType = scan_results[i].securityType;
            config.wapiPskType = WIFI_PSK_TYPE_ASCII;
            config.freq = scan_results[i].frequency;
            break;
        }
    }

    if (i >= scan_num) {
        printf("Error: No found ssid in scan_results\n");
        return;
    }
    printf("GetScanInfoList Success.\n");

    if (WIFI_SUCCESS != AddDeviceConfig(&config, &netId)) {
        printf("Error: AddDeviceConfig Fail\n");
        return;
    }
    printf("AddDeviceConfig Success.\n");

    if (WIFI_SUCCESS != ConnectTo(netId)) {
        printf("Error: ConnectTo Fail\n");
        return;
    }
    printf("ConnectTo Success\n");

    OS_Sleep(3);

    WifiLinkedInfo get_linked_res;

    if (WIFI_SUCCESS != GetLinkedInfo(&get_linked_res)) {
        printf("Error: GetLinkedInfo Fail\n");
        return;
    }
    printf("GetLinkedInfo Success.\n");

    printf("ssid: %s\n", 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: %d\n", get_linked_res.rssi);

    unsigned char get_mac_res[WIFI_MAC_LEN];

    if (WIFI_SUCCESS != GetDeviceMacAddress(get_mac_res)) {
        printf("Error: GetDeviceMacAddress Fail\n");
        return;
    }
    printf("GetDeviceMacAddress Success.\n");
    for (int j = 0; j < WIFI_MAC_LEN - 1; j++) {
        printf("%02X:", get_mac_res[j]);
    }
    printf("%02X\n", 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()
{
//socket create!
    s  = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

//address info!
    struct 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);

//connect!
    if(connect(s,(void *)&server_addr,sizeof(server_addr)) < 0) {
        printf("connect tcp_server failed! \r\n");
    } else {
        printf("connect tcp_server successfuly! \r\n");
    }
// send data
    send(s, "xr806\n", 7, 0);
}
static void MainThread(void *arg)
{
    gpio_output_init();
    wifi_connect();
    ping_init();
    ping(&ping_t);

    tcp_test_init();
    char buf[32];
    int cnt = 0;
    while(1) {
        sprintf(buf,"XR806:%s : %d \r\n",cJSON_Version(), cnt++);
        //向服务器发送数据
        send(s,buf, sizeof(buf), 0);
        printf("%s:Hello XR806 \r\n",__func__);
        
        gpio_output_ctl(1);
        OS_Sleep(1);
        gpio_output_ctl(0);
        OS_Sleep(1);
    }
}

void WifiTestMain(void)
{
    printf("Wifi Test Start\r\n");

    if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,
                        OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
        printf("[ERR] Create MainThread Failed\n");
    }
}

SYS_RUN(WifiTestMain);

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 <network IPv6 state>
GetLinkedInfo Success.
ssid: ChinaNet-111
bssid: 5475956E3374
rssi: 110
GetDeviceMacAddress Success.
9C:9E:49:BA:5B:01
PING 129.204.63.27 520 bytes of data.
Request timeout for icmp_seq=1
512 bytes from 129.204.63.27: icmp_seq=2    time=43 ms
512 bytes from 129.204.63.27: icmp_seq=3    time=43 ms
512 bytes from 129.204.63.27: icmp_seq=4    time=44 ms
512 bytes from 129.204.63.27: icmp_seq=5    time=43 ms
512 bytes from 129.204.63.27: icmp_seq=6    time=45 ms
512 bytes from 129.204.63.27: icmp_seq=7    time=46 ms
512 bytes from 129.204.63.27: icmp_seq=8    time=44 ms
512 bytes from 129.204.63.27: icmp_seq=9    time=44 ms
512 bytes from 129.204.63.27: icmp_seq=10    time=44 ms
512 bytes from 129.204.63.27: icmp_seq=11    time=44 ms
512 bytes from 129.204.63.27: icmp_seq=12    time=44 ms
512 bytes from 129.204.63.27: icmp_seq=13    time=44 ms
512 bytes from 129.204.63.27: icmp_seq=14    time=44 ms
512 bytes from 129.204.63.27: icmp_seq=15    time=43 ms

--- 129.204.63.27 ping statistics ---
15 packets transmitted, 14 received, 6% packet loss, time 672ms
rtt min/avg/max/mdev = 43/43/46/3 ms
connect tcp_server successfuly! 
MainThread:Hello XR806 
MainThread:Hello XR806 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1434122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】const修饰指针的不同作用

目录 const修饰变量 const修饰指针变量 ①不用const修饰 ②const放在*的左边 ③const放在*的右边 ④*的左右两边都有const 结论 const修饰变量 变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变量。 但…

vue - 指令(一)

看文章可以得到什么&#xff1f; 1.可以快速的了解并会使用vue的指令 2.可以加深你对vue指令的理解&#xff0c;知道每个指令代表什么功能​​​​​​​ 目录 什么是vue的指令&#xff1f;​​​​​​​ vue常见指令的使用 v-html v-show v-if v-else 和v-else-…

JVM 性能调优 - Java 中的四种引用(4)

为什么会有四种引用 我们先回顾下在 Java 虚拟机内存体系(1) 中提到了的垃圾回收算法 1、引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它,计数器的值就加一。每当有一个引用失效,计数器的值就减一。当计数器值为零时,这个对象被认为没有其他对象引用,…

解决ssh: connect to host 192.168.x.x port 22: Connection refused

我在使用scp命令向另一目标主机传输文件时提示ssh: connect to host 192.168.x.x port 22: Connection refused错误&#xff0c;总结出现的原因&#xff0c;及解决办法。 查看目标主机的ssh服务是否启动 service ssh status 如下图显示则启动状态 如果提示Unit ssh.service co…

python制作恶意软件删除工具

今天&#xff0c;来教大家用python制作一个恶意软件删除工具 查杀流程图 对&#xff0c;就这些&#xff0c;已经具备了杀毒软件的功能 判断文件是否为病毒 要查杀病毒&#xff0c;先要判断文件是不是病毒&#xff08;不然删错了咋办&#xff09;&#xff0c;这里我们用获取文…

『运维备忘录』之 Vim 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

多彩贵州人文山水展风采,微环境监测智能调控护古韵

一、人文山水时光峰峦——多彩贵州历史文化展 2月3日&#xff0c;贵州省博物馆向公众开放《人文山水时光峰峦——多彩贵州历史文化展》。6000平方米展厅里&#xff0c;从石器时期开始&#xff0c;通过六个篇章&#xff0c;用3503件文物的回忆链&#xff0c;系统化的向观众揭开…

我要成为嵌入式高手之2月4、5日Linux高编第二天!!

读写函数接口 1、fgetc 语法&#xff1a; 功能&#xff1a;从流中获取一个字符 练习1&#xff1a;编写程序统计文件的行数 #include <stdio.h>int main(void) {FILE *fp NULL;char ch 0;int row 0;fp fopen("file.txt","r");if (NULL fp){pe…

C#验证字符串的长度,用正则表达式 vs 字符数组长度或字符串的长度

目录 一、使用的方法 1.使用正则表达式 2.通过计算字符串的长度验证 二、实例 1.源码 2.生成效果 一、使用的方法 1.使用正则表达式 使用正则表达式可以判断和限制用户输入的字符串长度。 比如验证用户密码不得少于8为&#xff0c;匹配的正则表达式"^.{8,}$"…

ShardingSphere 5.x 系列【5】Spring Boot 3 集成并实现读写分离

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 使用限制3. 案例演示3.…

空气质量预测 | Matlab实现基于SVR支持向量机回归的空气质量预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 政府机构使用空气质量指数 (AQI) 向公众传达当前空气污染程度或预测空气污染程度。 随着 AQI 的上升,公共卫生风险也会增加。 不同国家有自己的空气质量指数,对应不同国家的空气质量标准。 基于支持向量机(Su…

高速接口PCB布局指南(一)高速信号接口概述

高速接口PCB布局指南&#xff08;一&#xff09;高速信号接口概述 1.什么是高速信号接口&#xff1f;2.高速信号PCB设计概述2.1 概述2.2 关键信号 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.什么是高速信号接口&#xff1f; 高速信号接口是指用于传输高…

jmeter-04创建请求

文章目录 一、发送请求-查看响应流程二、新建请求三、选择请求方式&#xff0c;填写url1.发送get请求当只有请求方式不一样的时候&#xff0c;参数都填写在参数栏里面&#xff0c;GET请求与POST请求的区别&#xff1f; 2.发送post请求2.1 application/x-www-form-urlencoded2.2…

二叉搜索树题目:二叉搜索树的最近公共祖先

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树的最近公共祖先 出处&#xff1a;235. 二叉搜索树的最近公共祖先 难度 3 级 题目描述 要求 给定一个…

Springboot集成ElasticSearch快速入门demo

一、ElasticSearch介绍 elasticsearch是构建在Apache Lucene上的使用Java语言开发的开源分布式搜素引擎。Lucene是一个开源的全文搜索引擎工具包&#xff0c;它仅是一个工具包而不是一个完整的工作引擎&#xff0c;并且只能被Java应用程序调用&#xff0c;elasticsearch基于RES…

云计算运营模式介绍

目录 一、云计算运营模式概述 1.1 概述 二、云计算服务角色 2.1 角色划分 2.1.1 云服务提供商 2.1.2 云服务消费者 2.1.3 云服务代理商 2.1.4 云计算审计员 2.1.5 云服务承运商 三、云计算责任模型 3.1 云计算服务模式与责任关系图 3.2 云计算服务模式与责任关系解析…

C++进阶--搜索二叉树

概念 搜索二叉树是一种特殊的二叉树&#xff0c;其具有以下特点&#xff1a; 1.对于每个结点&#xff0c;它的左子树中的所有节点的值都小于该节点的值&#xff0c;而右子树中的所有节点的值都大于该节点的值。 2.左子树和右子树都是搜索二叉树。 这个 特性使得搜索二叉树可…

计算机网络原理基础

目录 前言&#xff1a; 1.网络发展史 2.网络通信基础 2.1IP地址 2.1.1定义 2.1.2格式 2.2端口号 2.2.1定义 2.2.2格式 2.3协议 2.3.1定义 2.3.2作用 2.3.3分层 2.4五元组 2.4.1定义 2.4.2组成 3.TCP/IP五层网络模型 3.1模型概念 3.2模型构成 3.3网络分层对应…

06-Java适配器模式 ( Adapter Pattern )

原型模式 摘要实现范例 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁 适配器模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接口功能 举个真实的例子&#xff0c;读卡器是作为内存卡和笔记本之间的适配器。您将内…

机器学习逻辑回归模型训练与超参数调优 ##3

文章目录 [TOC]基于Kaggle电信用户流失案例数据&#xff08;可在官网进行下载&#xff09;逻辑回归模型训练逻辑回归的超参数调优 基于Kaggle电信用户流失案例数据&#xff08;可在官网进行下载&#xff09; 数据预处理部分可见&#xff1a; 机器学习数据预处理方法&#xff0…