【XR806开发板试用】xr806使用tcp socket与手机通信

本文为极术社区XR806开发板活动试用文章。
参考:基于星辰处理器的全志XR806开源鸿蒙开发板上手体验 搭建环境。并成功编译。

项目源码 : https://gitee.com/kingwho/smart-home

在同一个局域网中,手机与xr806连接后,手机 APP 每隔 1s,发送按键的值给xr806,用于控制xr806的led,然后xr806在返回按键,温度,适度(温度,适度为模拟数据)数据给手机app显示。

将 smart_home 放入 device/xradio/xr806/ohosdemo 下的目录,并修改 device/xradio/xr806/ohosdemo/BUILD.gn 为

group("ohosdemo") {deps = [#"hello_demo:app_hello",#"iot_peripheral:app_peripheral",#"wlan_demo:app_WlanTest","smart_home:app_smart_home",]
}

目录结构

.
├── BUILD.gn
└── src├── main.c├── tcp_net_socket.c└── tcp_net_socket.h

使用 WIFI 编译时会报错,进行如下操作即可,在随后的编译中可能还会出现,再次如下操作执行即可。

cd device/xradio/xr806/xr_skylark/project/demo/wlan_ble_demo/image/xr806
cp image_wlan_ble.cfg image_wlan_ble.cfg.bk
cat image_auto_cal.cfg > image_wlan_ble.cfg

cjson使用这些宏会报错,建议直接使用 cjson 宏定义后面函数。

#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull())
#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
#define cJSON_AddRawToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateRaw(s))

xr806连接WIFI后 IP地址可由串口输出打印查看

[net INF] msg <wlan scan success>
GetScanInfoList Success.
AddDeviceConfig Success.
[net INF] no need to switch wlan mode 0
en1: Trying to associate with 94:83:c4:0e:70:be (SSID='GL-MT300N-V2-0be' freq=2437 MHz)
ConnectTo Success
en1: Associated with 94:83:c4:0e:70:be
en1: WPA: Key negotiation completed with 94:83:c4:0e:70:be [PTK=CCMP GTK=CCMP]
en1: CTRL-EVENT-CONNECTED - Connection to 94:83:c4:0e:70:be completed [id=0 id_str=]
[net INF] msg <wlan connected>
[net INF] netif is link up
[net INF] start DHCP...
[net INF] netif (IPv4) is up
[net INF] address: 192.168.8.248
[net INF] gateway: 192.168.8.1
[net INF] netmask: 255.255.255.0
[net INF] msg <network IPv6 state>
[net INF] IPv6 addr state change: 0x0 --> 0x1
[net INF] msg <>

xr806 的固件更新后,需要使用下载器软件重新加载下固件,否则下载的可能还是上次的固件。

BUILD.gn

import("//device/xradio/xr806/liteos_m/config.gni")static_library("app_smart_home") {configs = []sources = ["src/main.c","src/tcp_net_socket.c",]cflags = board_cflagsinclude_dirs = board_include_dirsinclude_dirs += ["//kernel/liteos_m/kernel/arch/include","//base/iot_hardware/peripheral/interfaces/kits","//utils/native/lite/include","//foundation/communication/wifi_lite/interfaces/wifiservice","//third_party/lwip/src/include","//third_party/cJSON",]
}

tcp_net_socket.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lwip/sockets.h"int tcp_server_init(int port)
{int sfd = 0;struct sockaddr_in saddr;sfd = socket(AF_INET,SOCK_STREAM,0);memset(&saddr, 0, sizeof(struct sockaddr));saddr.sin_family  = AF_INET;saddr.sin_port    = htons(port);saddr.sin_addr.s_addr = INADDR_ANY;bind(sfd, (struct  socket*)&saddr, sizeof(struct sockaddr));listen(sfd,5);return sfd;
}int tcp_server_accept(int sfd)
{int cfd = 0;struct  sockaddr_in caddr;memset(&caddr, 0, sizeof(struct sockaddr));int addrl = sizeof(struct sockaddr);cfd = accept(sfd , (struct sockaddr*)&caddr , &addrl);return cfd;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ohos_init.h"
#include "kernel/os/os.h"
#include "iot_gpio.h"
#include "wifi_device.h"
#include "cJSON.h"
#include "lwip/sockets.h"
#include "tcp_net_socket.h"static void wifi_connect(char *ssid, char *passwd);
static OS_Thread_t g_main_thread;static void MainThread(void *arg)
{unsigned int led_pin = 21; /* GPIOA_PIN21 */unsigned int key_pin = 11; /* GPIOA_PIN11 */IotGpioValue key_value;int led_value = 0;unsigned int tem = 0, hum = 0, s = 0;cJSON* dev_dat = NULL;int sfd = 0;int cfd = 0;char send_buf[512] = {0};char recv_buf[512] = {0};wifi_connect("GL-MT300N-V2-0be", "goodlife");IoTGpioInit(led_pin);IoTGpioSetDir(led_pin, IOT_GPIO_DIR_OUT);IoTGpioInit(key_pin);IoTGpioSetDir(key_pin, IOT_GPIO_DIR_IN);sfd = tcp_server_init(8080);cfd = tcp_server_accept(sfd);while (1) {srand( s++ );tem = rand()%10 + 20;hum = rand()%20 + 40;IoTGpioGetInputVal(key_pin, &key_value);printf("kw : hello world! key : %d tem : %d hum : %d\r\n", key_value, tem, hum);IoTGpioSetOutputVal(led_pin, led_value);recv(cfd, recv_buf, sizeof(recv_buf), 0);memset(send_buf, 0, sizeof(send_buf));sprintf(send_buf, "{\"led\":\"%d\",\"key\":\"%d\",\"tem\":\"%d\",\"hum\":\"%d\"}",\led_value, key_value, tem, hum);		send(cfd,send_buf, strlen(send_buf),0);dev_dat = cJSON_Parse(recv_buf);led_value = cJSON_GetObjectItem(dev_dat, "led")->valuestring[0] - '0';		printf("led data : %d\r\n", led_value);cJSON_Delete(dev_dat);}}static void wifi_connect(char *ssid, char *passwd)
{char *ssid_want_connect = ssid;char *psk = passwd;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]);}
void SmartHome(void)
{if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,OS_THREAD_PRIO_APP, 8 * 1024) != OS_OK) {printf("[ERR] Create MainThread Failed\n");}
}
SYS_RUN(SmartHome);
  • APP 采用 APIClode 开发,使用 html js 进行开发.
    APICloude Studio 软件下载,以及使用:
    https://docs.apicloud.com/apicloud3/#wifi-preview

  • 手机安装 Apploader,可以进行调试
    安装Apploader下载 : https://docs.apicloud.com/Download/download

  • 将 SmartHome 导入 APICloude Studio
    html/main.html 对应登录界面, 如下可修改默认 IP 和端口号

    <div id="bt_log"><form name="myForm" action="" onsubmit="return validateForm()" method="post"><div><label>IP地址</label><input type="text" name="ip" value="192.168.8.248"></div><div><label>端口号</label><input type="text" name="port" value="8080"></div><div><input type="submit" class="btn" value="登录" onmouseover="this.style.backgroundPosition='left -36px'"onmouseout="this.style.backgroundPosition='left top'"></div></form></div>

在这里插入图片描述

html/user_app.html 对应应用界面,与 xr806 在同一个局域网中,同进行通信,通信使用的为 json 数据。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

背包2讲(2.6)

问题1&#xff1a;装箱问题 题解&#xff1a;这题其实本质上也是01背包&#xff0c;只不过算是变式&#xff0c;要求剩余空间最小值&#xff0c;我们可以转换成最大可以装多少的问题&#xff0c;然后就可以很快的写出题的答案 #include<bits/stdc.h> using namespace st…

c++学习第十六讲---STL常用容器---stack容器,queue容器

一、stack容器&#xff1a; 1.stack基本概念&#xff1a; stack栈容器 stack是一种先进后出的数据结构&#xff0c;它只有一个出口。 栈中只有顶端的元素才能被使用&#xff0c;因此不存在遍历操作。 栈中进数据&#xff1a;入栈 --- push() 栈中出数据&#xff1a;出栈 -…

【UE Niagara】实现物体变形的两种方式

目录 效果 步骤 方式一、通过设置粒子位置 方式二、通过线性力 效果 步骤 方式一、通过设置粒子位置 新建一个Niagara系统&#xff0c;选择Empty模板 这里命名为“NS_Morph” 打开“NS_Morph”&#xff0c;先添加一个“Spawn Burst Instantaneous”模块&#xff0c;“Spa…

用友U8 Cloud ReportDetailDataQuery SQL注入漏洞复现(QVD-2023-47860)

0x01 产品简介 用友U8 Cloud 提供企业级云ERP整体解决方案,全面支持多组织业务协同,实现企业互联网资源连接。 U8 Cloud 亦是亚太地区成长型企业最广泛采用的云解决方案。 0x02 漏洞概述 用友U8 cloud ReportDetailDataQuery 接口处存在SQL注入漏洞,攻击者未经授权可以访…

手撕spring bean的加载过程

这里我们采用手撕源码的方式&#xff0c;开始探索spring boot源码中最有意思的部分-bean的生命周期&#xff0c;也可以通过其中的原理理解很多面试以及工作中偶发遇到的问题。 springboot基于约定大于配置的思想对spring进行优化&#xff0c;使得这个框架变得更加轻量化&#…

【win】vscode无法使用ctrl+shift+p快捷键的解决方案

本文首发于 ❄️慕雪的寒舍 今天使用vscode的时候遇到的这个问题&#xff0c;明明快捷键设置的是ctrlshiftp&#xff0c;但是在电脑上怎么敲都敲不出来&#xff0c;因为用这个快捷键打开命令面板都习惯了&#xff0c;也不想换&#xff0c;就在找原因。 同时百度的时候还遇到了…

vue懒加载请求思路

当页面中不存在分页时&#xff0c;首先考虑到的就是懒加载&#xff0c;所以今天提供一个懒加载的思路。 首先是是么时候应该触发懒加载&#xff0c;以上面页面为例当页面容器中的卡片不能充满屏幕时就会触发加载出新数据&#xff0c;触发前提是1.已获取数据并非全部的。2.上一次…

Vitest 单元测试详解

一、自动化测试&#xff08;TDD&#xff09;的一些概念&#xff1a; 自动化测试&#xff08;TDD&#xff09;概念&#xff1a; 自动化测试是指 使用独立于待测软件的其他软件或程序来自动执行测试&#xff0c;比较实际结果与预期 并生成测试报告这一过程。在测试流程已经确定后…

Python:批量url链接保存为PDF

我的数据是先把url链接获取到存入excel中&#xff0c;后续对excel做的处理&#xff0c;各位也可以直接在程序中做处理&#xff0c;下面就是针对excel中的链接做批量处理 excel内容格式如下&#xff08;涉及具体数据做了隐藏&#xff09; 标题文件链接文件日期网页标题1http://…

C++二维数组

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习二维数组。 文章目录 1.二维数组的概念与思想 2.二维数组和一维数组的区别 3.二维数组的特点 4.二维数组的操作 1.定义 2.初始化 1.直…

百面嵌入式专栏(面试题)进程管理相关面试题1.0

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍进程管理相关面试题 。 一、进程管理相关面试题 进程是什么?操作系统如何描述和抽象一个进程?进程是否有生命周期?如何标识一个进程?进程与进程之间的关系如何?Linux操作系统的进程0是什么?Linux操…

【Linux】线程Pthread的概念 | NPTL线程库函数

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;Linux系列专栏&#xff1a;Linux基础 &#x1f525; 给大家…