社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 266阅读
  • 5回复

[分享]鸿蒙上点亮LED灯

楼层直达
z3960 
级别: FLY版主
发帖
786690
飞翔币
211594
威望
215717
飞扬币
2617541
信誉值
8




本文重点:
  • 如何编写点亮 LED 灯程序
  • 如何编译烧录点亮 LED 灯程序
  • 如何调试点亮 LED 灯程序

步骤
步骤一:添加点亮 LED 源码文件


①新增 my_led 文件夹
在./applications/BearPi/BearPi-HM_Nanomple 路径下新建一个 my_led 目录,用于存放业务源码文件。
②新增 led_example.c 文件
在./applications/BearPi/BearPi-HM_Nanomple/my_led 路径下新建一个 led_example.c 文件,该文件为业务源码文件。
③新增 BUILD.gn 文件
在./applications/BearPi/BearPi-HM_Nanomple/my_led 路径下新建一个 BUILD.gn 文件,该文件为业务源码编译脚本。
步骤二:添加点亮 LED 灯源码


代码如下:#include <stdio.h>#include <unistd.h>#include "ohos_init.h"#include "wifiiot_gpio.h"#include "wifiiot_gpio_ex.h"void led(void){GpioInit(); //初始化GPIOIoSetFunc(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_IO_FUNC_GPIO_2_GPIO);//设置GPIO_2的复用功能为普通GPIOGpioSetDir(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_GPIO_DIR_OUT);//设置GPIO_2为输出模式GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2,1);//设置GPIO_2输出高电平点亮LED灯}APP_FEATURE_INIT(led);
步骤三:​编写业务编译构建文件 BUILD.gn
编写用于将业务构建成静态库的 BUILD.gn 文件:


在./applications/BearPi/BearPi-HM_Nanomple/my_led 下的 BUILD.gn 文件中添加如下代码:static_library("myled") {sources = ["led.c"]include_dirs = ["//utils/native/lite/include","//base/iot_hardware/interfaces/kits/wifiiot_lite"]}
static_library 中指定业务模块的编译结果,为静态库文件 libmyled.a,开发者根据实际情况完成填写。
sources 中指定静态库 .a 所依赖的 .c 文件及其路径,若路径中包含"//"则表示绝对路径(此处为代码根路径),若不包含"//"则表示相对路径。
include_dirs 中指定 source 所需要依赖的 .h 文件路径。
步骤四:编写模块编译构建文件 BUILD.gn
编写模块 BUILD.gn 文件,指定需参与构建的特性模块。


在./applications/BearPi/BearPi-HM_Nanomple 下的 BUILD.gn 文件中添加如下代码:import("//build/lite/config/component/lite_component.gni")lite_component("app") {features = ["my_led:myled",]}
my_led 是相对路径,指向:./applications/BearPi/BearPi-HM_Nanomple/my_led/BUILD.gn
led 是目标,指向:./applications/BearPi/BearPi-HM_Nanomple/my_led/BUILD.gn中的static_library("myled")
[size=; font-size: 1.176em,1.176em]Led 闪烁实验
代码如下:调试LED程序#include "ohos_init.h"#include "unistd.h"#include "wifiiot_gpio.h"#include "wifiiot_gpio_ex.h"void led_delay(void){GpioInit();IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_IO_FUNC_GPIO_2_GPIO);GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_GPIO_DIR_OUT);for(int i = 0; i < 10; i++){GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2,1);usleep(1000000);GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2,0);usleep(1000000);}}APP_FEATURE_INIT(led_delay);
[size=; font-size: 1.176em,1.176em]总结
如下:#include "ohos_init.h" 包含APP_FEATURE_INIT这个函数"//base/iot_hardware/interfaces/kits/wifiiot_lite"  相对路径在 Z:homebearpiBearPI_codebearpi-hm_nanobaseiot_hardwareinterfaceskitswifiiot_litewifiiot_gpio_ex.hZ:homebearpiBearPI_codebearpi-hm_nanobaseiot_hardwareinterfaceskitswifiiot_litewifiiot_gpio.hIoSetFunc————————》gpio的设置GpioSetDir———————》gpio的模式
结果如下图:
 
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。
z3960 
级别: FLY版主
发帖
786690
飞翔币
211594
威望
215717
飞扬币
2617541
信誉值
8

只看该作者 1 发表于: 2023-01-18


鸿蒙上实现简单的聊天功能




需求分析:

  • 连接指定 IP 和端口
  • 显示接收的内容
  • 具有发送的功能

[size=; font-size: 1.176em,1.176em]控件介绍

①Socket 连接



场景介绍:应用通过 Socket 进行数据传输,支持 TCP 和 UDP 两种协议。



接口说明:Socket 连接主要由 socket 模块提供。具体接口说明如下表。




基本例程(参考我之前的家庭医生终端系统):import socket from '@ohos.net.socket';let tcp = socket.constructTCPSocketInstance();tcp.bind({address: '0.0.0.0', port: 12121, family: 1}, err => {if (err) {console.log('bind fail');return;}console.log('bind success');})tcp.on('message', value => {console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo)let da = resolveArrayBuffer(value.message);let dat_buff = String(da);//此处对接受到的数据进行处理});//将接受到的数据转化为文本型           function resolveArrayBuffer(message){if (message instanceof ArrayBuffer) {let dataView = new DataView(message)let str = ""for (let i = 0;i < dataView.byteLength; ++i) {let c = String.fromCharCode(dataView.getUint8(i))if (c !== "n") {str += c}}return str;}}//数据的发送函数function send_once(Con_buff) {if (flag == false) {let promise = tcp.connect({ address: { address: 'xxx.xxx.xxx.xxx', port: xxxx, family: 1 }, timeout: 2000 });promise.then(() => {console.log('connect success');flag = true;tcp.send({data: Con_buff}, err => {if (err) {console.log('send fail');return;}console.log('send success');})}).catch(err => {console.log('connect fail');});} else if (flag == true) {tcp.send({data: Con_buff}, err => {if (err) {console.log('send fail');return;}console.log('send success');})}}

②AppStorage 与组件同步


在管理组件拥有的状态中,已经定义了如何将组件的状态变量与父组件或祖先组件中的 @State 装饰的状态变量同步,主要包括 @Prop、@Link、@Consume。
本章节定义如何将组件变量与 AppStorage 同步,主要提供 @StorageLink 和 @StorageProp 装饰器。

@StorageLink 装饰器


组件通过使用 @StorageLink(key) 装饰的状态变量,与 AppStorage 建立双向数据绑定,key 为 AppStorage 中的属性键值。
当创建包含 @StorageLink 的状态变量的组件时,该状态变量的值将使用 AppStorage 中的值进行初始化。
在 UI 组件中对 @StorageLink 的状态变量所做的更改将同步到 AppStorage,并从 AppStorage 同步到任何其他绑定实例中,如 PersistentStorage 或其他绑定的 UI 组件。

@StorageProp 装饰器


组件通过使用 @StorageProp(key) 装饰的状态变量,将与 AppStorage 建立单向数据绑定,key 标识 AppStorage 中的属性键值。
当创建包含 @StoageProp 的状态变量的组件时,该状态变量的值将使用 AppStorage 中的值进行初始化。
AppStorage 中的属性值的更改会导致绑定的 UI 组件进行状态更新。let varA = AppStorage.Link('varA')let envLang = AppStorage.Prop('languageCode')@Entry@Componentstruct ComponentA {@StorageLink('varA') varA: number = 2@StorageProp('languageCode') lang: string = 'en'private label: string = 'count'private aboutToAppear() {this.label = (this.lang === 'zh') ? '数' : 'Count'}build() {Row({ space: 20 }) {Button(`${this.label}: ${this.varA}`).onClick(() => {AppStorage.Set<number>('varA', AppStorage.Get<number>('varA') + 1)})Button(`lang: ${this.lang}`).onClick(() => {if (this.lang === 'zh') {AppStorage.Set<string>('languageCode', 'en')} else {AppStorage.Set<string>('languageCode', 'zh')}this.label = (this.lang === 'zh') ? '数' : 'Count'})}}}
即通过 AppStorage.Link 和 @StorageLink 的方式,可实现外部动态刷新 Text 组件和 image 组件(等等之类都可以),方便我们在全局调用时更新数据。
[size=; font-size: 1.176em,1.176em]UI 设计
本项目的基本内容是可以在预览器中看到的,所以先在预览器中简单设计 UI。

①基本界面




以后不会大时间讲解 UI 了,会直接放成品,且我的源码都在 Gitee 仓上存在,需要的可以自己下载,会着重体现程序部分。

②接口绑定


首先是接收框处的变量绑定:let Rc_message = AppStorage.Link('Rc_message')@StorageLink('Rc_message') Rc_message: String = '收到消息'Text(`${this.Rc_message}`).width("98%").height("35%").borderStyle(BorderStyle.Solid).borderWidth(8).borderColor(0xAFEEEE).borderRadius(20).fontSize(25)
③TCP 回调设置tcp.on('message', value => {console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo)let da = resolveArrayBuffer(value.message);let dat_buff = String(da);AppStorage.Set<String>('Rc_message',dat_buff);//AppStorage.Set<String>('ID_1_stata','rgba(0, 109, 229, 0.95)');});
该部分实现聊天框内部的文字刷新。

④IP 设置​


这里我是使用的合宙的 TCP 工具[wstool (luatos.com)](


在此处修改 IP 和端口:



⑤远端模拟器




在模拟器中打开如上。
[size=; font-size: 1.176em,1.176em]实际测试


使用模拟器进行发送:


在 TCP 工具处有接收到内容,此时进行回复。


在 APP 端可以接收到并显示(暂时可能只支持英文接受显示)。








[size=; font-size: 1.176em,1.176em]动态图


TCP 助手显示如下:



本项目 Gitee 仓地址:

https://gitee.com/lalhan/eTs_Study
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。
级别: 超级版主
发帖
884020
飞翔币
253155
威望
224883
飞扬币
2708258
信誉值
0

只看该作者 2 发表于: 2023-01-19
来看一下
级别: 超级版主
发帖
884020
飞翔币
253155
威望
224883
飞扬币
2708258
信誉值
0

只看该作者 3 发表于: 2023-01-19
不错,了解了
srwam 
级别: 超级版主
发帖
710335
飞翔币
1951
威望
25627
飞扬币
3210801
信誉值
0

只看该作者 4 发表于: 2023-01-19
来看看
srwam 
级别: 超级版主
发帖
710335
飞翔币
1951
威望
25627
飞扬币
3210801
信誉值
0

只看该作者 5 发表于: 2023-01-19
了解一下