创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

智能猫眼的实现是采用流媒体协议RTSP

gh_e4f28cfa3159 来源:OpenAtom OpenHarmony 作者:OpenAtom OpenHarmony 2022-05-16 09:20 次阅读

前言

智能猫眼是一种家居安防产品。是安装在防盗门上的一种嵌入式设备,可以通过摄像头获取图像显示至手机应用中,这样老人或者小孩就可以看清门外的情况。

智能猫眼的实现是采用流媒体协议 RTSP。该协议定义了程序如何通过 IP 网络传送多媒体数据。RTSP 多用于安防摄像头、车载监控、网络直播等场景应用。本文档旨在讲解在 OpenAtom OpenHarmony(以下简称“OpenHarmony") 1.0.1 release 下将 Hi3518EV300 编码后的 H.265 视频格式(H.265 是一种视频编码格式,可以由 OpenHarmony 媒体子系统产生),通过 RTSP 传输显示到手机的应用中。

cc8c790e-d2bd-11ec-bce3-dac502259ad0.jpg

注:Hi3518EV300是 润和Hi3518 HiSpark IPC AI摄像头开发板套件

如上图片:Hi3518EV300 设备将捕获到的图像通过 RTSP 发送到手机应用中并显示出来。

开发流程

RTSP 采用 Server/Client 模式,在本样例场景中 Hi3518EV300为RTSP Server,手机应用为 RTSP Client。在 RTSP 体系结构包含 RTSP和RTP(实时传输协议)两种协议,其中 RTSP 协议用于建立连接与传输多媒体控制命令(开始、暂停、结束等),RTP 协议用来传输多媒体数据(音频、视频)。

RTSP Server 的实现分为如下几步:

●设置 Wi-Fi:将手机与 Hi3518EV300 在同一网络中;

●环形缓存区:将媒体子系统中编码出的 H.265 数据存入环形缓存中;

●RTSP:RTSP Server 通过 RTSP 与 RTSP Client 交互控制信息;

●RTP :RTSP Server 收到PLAY命令后从环形缓存中获取 H.265 数据并使用 RTP 协议发送。

如下图所示:

ccbad592-d2bd-11ec-bce3-dac502259ad0.jpg

如何运行 RTSP Server 可以参考文章智能猫眼 3518 开发样例,下面根据该文章讲解 RTSP Server 的实现流程。

代码结构:


├── smart_door_viewer_3518│   ├── BUILD.gn                                      // 编译构建│   ├── include│   │   ├── camera_sample.h                   // 摄像头操作头文件│   │   ├── rtp.h                                         // rtp协议传输头文件│   │   ├── rtsp_log.h                                // 打印调试头文件│   │   └── rtsp_server.h                           // rtsp头文件│   └── src│       ├── camera_sample.cpp                 // 摄像头实现│       ├── main.cpp                                   // 主函数│       ├── rtp.cpp                                       // rtp协议实现│       └── rtsp_server.cpp                         // rtsp协议实现├── foundation              │   └── multimedia│       └── media_lite│           ├── frameworks│           │   └── recorder_lite │           │       ├── recorder.cpp                //增加获取摄像头H.265数据实现类接口│           │       ├── recorder_impl.cpp       //增加获取摄像头H.265数据实现│           │       └── recorder_impl.h           //增加获取摄像头H.265数据实现定义│           └── interfaces│               └── kits│                   └── recorder_lite│└──recorder.h//增加应用层获取摄像头H.265数据实现类接口定义

设置Wi-Fi

设置 Wi-Fi 连接热点 ssid 为“Smedia”psk为“12345678”。

在文件 wpa_supplicant.conf 中修改如下:


country=GBctrl_interface=udpnetwork={    ssid="SMedia"    psk="12345678"}

设备启动后输入:


./bin/wpa_supplicant -iwlan0 -c/etc/wpa_supplicant.conf

输入 ifconfig 可查看到连接成功后的 IP 地址:

ccd7c4ae-d2bd-11ec-bce3-dac502259ad0.jpg

环形缓存区

在媒体子系统中,为了同步 RTSP Server 应用获取 H.265 数据须设计一个环形缓冲区。缓冲区总大小为 16*256K 长度的数组。put 为媒体子系统存放缓冲区的偏移值,get 为 RTSP Server(Hi3518EV300)线程获取缓冲区的偏移值,缓存区定义在文件 recorder_impl.h 下。


constexpr uint32_t RING_BUFF_MAX_CNT = 16;constexpruint32_tRING_BUFF_SIZE=256*1024;

具体实现如下:

初始情况下偏移值 put 与 get 的位置均在开头。

cd0b6048-d2bd-11ec-bce3-dac502259ad0.jpg

当 RTSP Server 启动后媒体子系统填充 buff,偏移值 put 向前移。

cd415892-d2bd-11ec-bce3-dac502259ad0.jpg

RTSP Server 通过偏移值 get 获取到视频编码数据后释放 buff,偏移值 get 向前移。

cd606f8e-d2bd-11ec-bce3-dac502259ad0.jpg

当 put 与 get 偏移超过 16 时重新置 1 因此形象地称为环形缓冲区,其中 get 永远在 put 后且间距不会超过 3 个 buff,实现是在 rtsp Server 中设置同步时间。

cd7e62f0-d2bd-11ec-bce3-dac502259ad0.jpg

代码实现逻辑:当 RTSP Server 运行到 RTP 时才会往缓冲区存放数据(ringStatus 标志位设置为 true)。存入缓冲区的首帧是从关键帧(帧头为 0x40 与 0x01 与 startFramFlag 标志位为 true)开始,后续所有帧都会保存到缓冲区中(saveFlag 标志位设置为 true,startFramFlag 标志位为 false),在函数 VideoSourceProcess 下实现。


if ((iNumber < RING_BUFF_MAX_CNT) && (ringStatus == true)) {    if((startFramFlag == true) &&(buffer.dataAddr[4]==0x40)        && (buffer.dataAddr[5]==0x01)) {        if (memcpy_s(ringFifo[iPut].buffer, RING_BUFF_SIZE, buffer.dataAddr, buffer.dataLen) != EOK) {            MEDIA_INFO_LOG("[Error] memcpy_s");         } else {            ringFifo[iPut].size = buffer.dataLen;            iPut = addring(iPut);            iNumber++;            startFramFlag = false;            saveFlag = true;        }     } else {         if(saveFlag == true) {             if (memcpy_s(ringFifo[iPut].buffer, RING_BUFF_SIZE, buffer.dataAddr, buffer.dataLen) != EOK) {                MEDIA_INFO_LOG("[Error] memcpy_s");              } else {                 ringFifo[iPut].size = buffer.dataLen;                 iPut = addring(iPut);                 iNumber++;                       }          }      }}

RTSP

RTSP Server 与 RTSP Client 通过 RTSP 协议收发控制命令,其基本流程如下:

●OPTION:首先 Client 连接到 Server 并发送 OPTION 命令,Server 立刻返回所支持的命令(OPTION、DESCRIBE、SETUP、PLAY、TEARDOWN);

●DESCRIBE:Client 发送描述命令(DESCRIBE),Server 通过一个 SDP 描述来进行反馈,反馈信息包括流数量、媒体类型等信息;

●SETUP:Client 分析 SDP 描述,并为会话中发送建立命令(SETUP),告诉 Server 用于接收媒体数据的端口;

●PLAY:连接建立完成后,Client 发送一个播放命令(PLAY),Server 就开始在 UDP 上传送媒体流(RTP包)到 Client;

●TERADOWN:最后 Client 可发送一个终止命令(TERADOWN)来结束流媒体会话。

其交互流程如下所示:

cd98e788-d2bd-11ec-bce3-dac502259ad0.jpg

在文件 rtsp_server.cpp 中,RTSP Server 收到 OPTION 后回复服务器提供的可用命令(OPTION、DESCRIBE、SETUP、PLAY、TEARDOWN)。

函数实现如下:


static void RtspOptions(char* sendBuff, RtspClientInfo &rtspCliInfo){    sprintf(sendBuff, "RTSP/1.0 200 OK
"                    "CSeq: %d
"                    "Public: OPTIONS, DESCRIBE, SETUP, PLAY, TEARDOWN
"                    "
",                    rtspCliInfo.rtspCseq);}

RTSP Server 收到 DESCRIBE 后回复 SDP (SDP 信息为会话名称和目的、会话持续时间、媒体类(音频、视频等)、传输协议(RTP/UDP/IP等)、媒体编码格式(H.264、H.265 等)、接收媒体的相关信息端口和格式等。)信息。

函数实现如下:


static void RtspDescribe(char* sendBuff, RtspClientInfo &rtspCliInfo){    char sdp[512];
    memset(sdp, 0, sizeof(sdp));    sprintf(sdp, "v=0
"                 "o=- 973 1 IN IP4 192.168.1.103
"                 "t=0 0
"                 "a=control:*
"                 "m=video 0 RTP/AVP 96
"                 "a=rtpmap:96 H265/90000
"                 "a=control:track0

");    sprintf(sendBuff, "RTSP/1.0 200 OK
CSeq: %d
"                    "Content-Base: %s
"                    "Content-type: application/sdp
"                    "Content-length: %d

"                    "%s",                    rtspCliInfo.rtspCseq,                    "rtsp://192.168.1.127:8554/test.264",                    strlen(sdp),                    sdp);}

RTSP Server 收到 SETUP 后回复传输模式(采用 RTP 传输)、端口号信息准备 play。

函数实现如下:


static void RtspStep(char* sendBuff, RtspClientInfo &rtspCliInfo){    sprintf(sendBuff,             "RTSP/1.0 200 OK
"            "CSeq: %d
"            "Transport: RTP/AVP;unicast;client_port=55532-55532;"            "server_port=%d-%d
"            "Session: 66334873
"            "
",            rtspCliInfo.rtspCseq, rtspCliInfo.clientPort, rtspCliInfo.clientPort + 1);}

RTSP Server 收到 PLAY 后回复 Range 的值为"npt=0.0000-",表示从开始播放,默认一直播放!随后发送视频流数据。


static void RtspPlay(char* sendBuff, RtspClientInfo &rtspCliInfo){    sprintf(sendBuff, "RTSP/1.0 200 OK
"                "CSeq: %d
"                "Range: npt=0.000-
"                "Session: 66334873; timeout=60

",                rtspCliInfo.rtspCseq);}

程序运行后使用 wireshark 抓取报文如下:

cdb83886-d2bd-11ec-bce3-dac502259ad0.jpg

RTP

RTSP 会话进行到 PLAY 后就可启动 RTP 发送视频流数据,RTP 包分为 RtpHeader(Rtp 头)加 payload(负载数据),在文件 rtp.cpp 下的 UdpSendFrame 函数中。

RtpHeader

csrcLen csrc 计数,在没有 RTP 混频器的情况下通常为 0

●extension 扩展名,必须为 0

padding 填充位,不得使用填充,默认为 0

●version 版本号为 2

●payloadType 数据帧类型 96(H.265)

●marker 将一帧分片时区分头片

●seq 序列号为了以每片为单位

●timestamp 时间戳以每帧为单位

●ssrc 数据信源号


rtpPacket.rtpHeader.csrcLen = 0;rtpPacket.rtpHeader.extension = 0;rtpPacket.rtpHeader.padding = 0;rtpPacket.rtpHeader.version = 2;
rtpPacket.rtpHeader.payloadType = 96;
rtpPacket.rtpHeader.ssrc = 10;
rtpPacket.rtpHeader.timestamp = timestamp;timestamp+=90000/25;

payload

RTP 包最大为 1400 个字节,因此打包分为两种:

1.若 H.265 帧小于 1400 个字节时可放至一个 rtp 包中;

2.若 H.265 帧大于 1400 个字节时,则需要分片打包在多个 rtp 中;

当文件小于 1400 时直接放到 pyahload 中发送。


if (s32NalBufSize <= RTP_MAX_PKT_SIZE) {      if (memcpy_s(rtpPacket.payload, s32NalBufSize, pNalBuf, s32NalBufSize) != EOK){        SAMPLE_INFO("memcpy_s");    return -1;    }    rtpPacket.rtpHeader.marker   = 1;    rtpPacket.rtpHeader.seq = seq++;    ret = UdpSendPacket(&rtpPacket, s32NalBufSize);    sendBytes += ret;    SAMPLE_INFO("sendBytes->%d", sendBytes);}

若 H.265 帧大于 1400 个字节时就必须进行分片封包处理。则要设置 PayloadHdr、FU(Fragmentation Units)、DONL 暂不涉及可以省略,其中 PayloadHdr 固定为 49。


   0                   1                   2                   3    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   |    PayloadHdr (Type=49)       |   FU header   | DONL (cond)   |   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|   | DONL (cond)   |                                               |   |-+-+-+-+-+-+-+-+                                               ||FUpayload|

FUheader 格式为:S 置 1 表示起始片,E 置 1 表示最后片,FuType 就是实际的 Nal type 类型。


  +---------------+  |0|1|2|3|4|5|6|7|  +-+-+-+-+-+-+-+-+  |S|E|  FuType   |+---------------+

函数中实现如下:


int pktNum = s32NalBufSize / RTP_MAX_PKT_SIZE;         int remainPktSize = s32NalBufSize % RTP_MAX_PKT_SIZE;    int i, pos, head_len;    head_len = 2;    pos = head_len;     for(i = 0; i < pktNum; i++)    {      rtpPacket.rtpHeader.seq = seq++;            rtpPacket.payload[0] = 49 << 1;      rtpPacket.payload[1] = 1;      rtpPacket.payload[2] = (naluType & 0x7E)>>1;      if (i == 0) {         rtpPacket.rtpHeader.marker = 1;        rtpPacket.payload[2] |= 0x80; // start      }      else if (remainPktSize == 0 && i == (pktNum - 1)){        rtpPacket.rtpHeader.marker = 0;        rtpPacket.payload[2] |= 0x40; // end      }      if (memcpy_s(rtpPacket.payload + head_len + 1, RTP_MAX_PKT_SIZE, pNalBuf+pos, RTP_MAX_PKT_SIZE) != EOK) {        SAMPLE_INFO("memcpy_s");          return -1;      }            ret = UdpSendPacket(&rtpPacket, RTP_MAX_PKT_SIZE + head_len + 1);      if (ret < 0) {        SAMPLE_ERROR("rtpSendPacket is error");        goto cleanup;      }      sendBytes += ret;      pos += RTP_MAX_PKT_SIZE;    }    if (remainPktSize > 0)    {      {        rtpPacket.payload[0] = 49 << 1;        rtpPacket.payload[1] = 1;        rtpPacket.payload[2] = (naluType & 0x7E)>>1;        rtpPacket.payload[2] |= 0x40; // end      }      if (memcpy_s(rtpPacket.payload + head_len + 1, remainPktSize, pNalBuf+pos, remainPktSize) != EOK) {        SAMPLE_INFO("memcpy_s");          return -1;      }      rtpPacket.rtpHeader.seq = seq++;      ret = UdpSendPacket(&rtpPacket, remainPktSize+head_len+1);      if(ret < 0)      {        SAMPLE_ERROR("rtpSendPacket is error");        goto cleanup;      }      sendBytes += ret;    }

程序运行后使用 wireshark 抓取报文如下:

cdeaf3d4-d2bd-11ec-bce3-dac502259ad0.jpg

RTSP Client

RTSP Client 实现使用手机 APP”完美播放器“。

准备一台手机,在手机应用市场中搜索”完美播放器“并下载安装。

ce17673e-d2bd-11ec-bce3-dac502259ad0.jpg

打开菜单选择网址播放。

ce3e9674-d2bd-11ec-bce3-dac502259ad0.jpg

输入 rtsp 播放地址,其中 ip 地址 10.42.0.54为Hi3518EV300中Wi-Fi 的地址。

ce604102-d2bd-11ec-bce3-dac502259ad0.jpg

总结

丰富多样的 OpenHarmony 开发样例离不开广大合作伙伴和开发者的贡献,如果你也想把自己开发的样例分享出来,欢迎把样例提交到 OpenHarmony 知识体系 SIG 仓来,共建开发样例请参考如何共建开发样例。

审核编辑 :李倩



  • 数据
    +关注

    关注

    8

    文章

    4585

    浏览量

    80008
  • 视频编码
    +关注

    关注

    2

    文章

    84

    浏览量

    19286
  • OpenHarmony
    +关注

    关注

    7

    文章

    1145

    浏览量

    9552

原文标题:基于OpenHarmony实现智能猫眼

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    优博讯出席OpenHarmony技术日,探讨下一代安全支付终端

    4月25日“共建新技术、开拓新领域”的OpenHarmony技术日在深圳盛大召开。来自各企业、组织、....
    的头像 焦点讯 发表于 06-24 16:35 176次 阅读
    优博讯出席OpenHarmony技术日,探讨下一代安全支付终端

    博世:挖掘数据价值 化被动为主动

    持续提升质量意识,不断创新、尝试新方案,致力于给客户提供更好质量保障的产品,始终是博世汽车电子人共同....
    的头像 博世汽车电子事业部 发表于 06-24 16:13 264次 阅读

    WiFi-IoT 鸿蒙开发套件样例开发

    HiSpark WiFi-IoT鸿蒙开发套件 首发于HDC 2020,是首批支持HarmonyOS 2.0的开发套件,亦是鸿蒙官方推荐套件,由润和...
    发表于 06-24 15:44 581次 阅读

    样本量大于30可以认为是正态分布吗

    我经常会被问到这么一个问题:样本量多大就不用进行正态性检验了。殊不知,这问题的本身就是错误的,并不是....
    发表于 06-24 15:30 7次 阅读
    样本量大于30可以认为是正态分布吗

    YBImageBrowser iOS图片浏览器

    ./oschina_soft/YBImageBrowser.zip
    发表于 06-24 14:38 5次 阅读
    YBImageBrowser iOS图片浏览器

    【直播回顾】战码先锋第七期:三方应用开发者如何为开源做贡献

    6月23日晚上19点,战"码"先锋第7期直播 《三方应用开发者如何为开源做贡献》 ,在OpenHarmony社群内成功举行。本期课程,由华...
    发表于 06-24 11:23 353次 阅读
    【直播回顾】战码先锋第七期:三方应用开发者如何为开源做贡献

    区块哈希竞猜游戏系统开发加密哈希算法概述

      哈希算法(Hash function)又称散列算法,是一种从任何数据(文件、字符等)中创建小的数....
    的头像 搭建punk2558 发表于 06-24 09:51 29次 阅读
    区块哈希竞猜游戏系统开发加密哈希算法概述

    数据湖生态与数据智能峰会来袭 24日易华录有约

    ·数据湖生态与数据智能峰会来袭 6月24日易华录有约   ·   · ·   · ·   · ·  ....
    的头像 易华录 发表于 06-23 17:51 628次 阅读

    新思科技DesignDash解决方案帮助开发者更智慧地设计芯片

    新思科技的DesignDash数据可见性和机器学习(ML)引导设计优化解决方案正是为此而设计的。De....
    的头像 科技绿洲 发表于 06-23 15:22 168次 阅读
    新思科技DesignDash解决方案帮助开发者更智慧地设计芯片

    新华三连续四年位居IT统一运维软件市场榜首

    在数字化转型“深水区”,业务、技术体系和平台架构的日益复杂化和多元化,催生了云化、智能化的运维服务需....
    的头像 科技绿洲 发表于 06-23 14:43 286次 阅读

    基于OpenHarmony的智能金属探测器

    本项目由 Geek_Lite_Board 开发板和润和 RK3568 开发板构成,Geek_Lite....
    的头像 OpenAtom OpenHarmony 发表于 06-23 14:29 124次 阅读

    芯海科技赋能无界连接,为OpenHarmony3.1生态贡献一份力

    “人类面前有两条路。一条向内,通往虚拟现实。一条是向外,通往星辰大海。” ——刘慈欣。当互联网进化到....
    的头像 科技观点 发表于 06-23 11:37 158次 阅读
    芯海科技赋能无界连接,为OpenHarmony3.1生态贡献一份力

    每日推荐 | 每周论点有奖栏目,OpenHarmony学生挑战赛开启

    大家好,以下为电子发烧友推荐每日好帖,欢迎留言点评讨论~ 1、 推荐理由:即日起社区开始【每周论点】栏目(长期进行),以...
    发表于 06-23 10:39 5894次 阅读

    LAC中文词法分析解决方案

    ./oschina_soft/lac.zip
    发表于 06-23 10:10 6次 阅读
    LAC中文词法分析解决方案

    三年磨一剑 只为开源教育!OpenHarmony开源大师兄新品发布会即将启幕

    开放、共享、共建OpenHarmony开源大师兄新品发布会 2022 年 6月30日 10:00 AM     2019年12月 521位教师联合发...
    发表于 06-23 10:09 766次 阅读
    三年磨一剑 只为开源教育!OpenHarmony开源大师兄新品发布会即将启幕

    Health Connect的概念、工作原理及使用方法

    从 MyFitnessPal 应用帮助您记录一日三餐,再到 Withings 产品为您呈现自身健康水....
    的头像 谷歌开发者 发表于 06-22 16:10 232次 阅读

    松下KAIROS云服务让V.LEAGUE联赛直播更受欢迎

    通过“KAIROS云服务”的应用,在日本顶级排球联赛V.LEAGUE的官方视频发布平台V.TV上,进....
    的头像 科技绿洲 发表于 06-22 15:38 129次 阅读

    踏歌智行实现了“虚拟安全员”系统对安全员的替代

    自今年3月以来,踏歌智行鄂尔多斯永顺宽体车无人运输项目顺利进入“安全员下车”常态化阶段,现已实现7X....
    的头像 科技绿洲 发表于 06-22 14:34 108次 阅读

    【参与即有奖】OpenHarmony学生挑战赛等你来战!

    >>>>>
    发表于 06-22 14:10 3714次 阅读
    【参与即有奖】OpenHarmony学生挑战赛等你来战!

    本周四晚19:00战码先锋第7期直播丨三方应用开发者如何为开源做贡献

    本周四晚19:00战码先锋第7期直播丨三方应用开发者如何为开源做贡献OpenAtom OpenHarmony(以下简称“OpenHarmony”)工...
    发表于 06-22 10:54 831次 阅读
    本周四晚19:00战码先锋第7期直播丨三方应用开发者如何为开源做贡献

    【直播回顾】战码先锋第六期:共建测试子系统,赋能开发者提

    6月21日晚上19点,战"码"先锋第6期直播 《共建测试子系统,赋能开发者提高代码质量》 ,在OpenHarmony社群内成功举行。 本期课...
    发表于 06-22 10:47 773次 阅读
    【直播回顾】战码先锋第六期:共建测试子系统,赋能开发者提

    每日推荐 | OpenHarmony 3.1Release + 小凌派移植案例,RT-Thread快速入门资料汇总

    大家好,以下为电子发烧友推荐每日好帖,欢迎留言点评讨论~ 1、 推荐理由:LittleFS在嵌入式开发过程中经常遇到,但是如何...
    发表于 06-22 10:41 6481次 阅读

    开源软件-DtCraft通用分布式编程系统

    ./oschina_soft/DtCraft.zip
    发表于 06-22 10:36 9次 阅读
    开源软件-DtCraft通用分布式编程系统

    西南交通大学与百度Apollo助力构建良性循环人才发展生态

     6月21日,特色985工程、211工程、首批“双一流”建设高校——西南交通大学与百度Apollo签....
    的头像 科技绿洲 发表于 06-22 10:29 294次 阅读

    VAIV完成对5G保障方面专家CanGo Networks的收购

    近日,VAIV很自豪地宣布,我们已经完成了对位于印度钦奈的 CanGo Networks 的收购。C....
    的头像 科技绿洲 发表于 06-22 10:15 221次 阅读

    ArkUI开发框架介绍

    从系统视角来看,开发框架给应用提供了一个运行环境和基础的能力。当一个程序即应用包安装到系统中,通过系....
    的头像 OpenAtom OpenHarmony 发表于 06-22 10:12 164次 阅读

    OpenHarmony原子化服务开发快速入门体验(下)

    五、配置openharmony应用签名信息 采用自动配签名的方法,将设备使用USB数据线连接到电脑后....
    的头像 鸿蒙时代 发表于 06-22 10:11 1320次 阅读
    OpenHarmony原子化服务开发快速入门体验(下)

    OpenHarmony原子化服务开发快速入门体验(下)

    五、配置openharmony应用签名信息 采用自动配签名的方法,将设备使用USB数据线连接到电脑后,依次点击File->ProjectSt...
    发表于 06-22 09:56 1633次 阅读

    瑞迅科技推出开源鸿蒙Openharmony开发套件

    瑞迅科技 RK3568 OpenHarmony 开发套件, 6月星品重磅上新,搭载国产化系统,颜值....
    发表于 06-21 19:01 17次 阅读
    瑞迅科技推出开源鸿蒙Openharmony开发套件

    LittleFS如何在OpenHarmony中使用

    LittleFS是一个小型的Flash文件系统,它结合日志结构(log-structured)文件系....
    的头像 科技绿洲 发表于 06-21 17:03 243次 阅读
    LittleFS如何在OpenHarmony中使用

    DataReporter数据上报框架

    ./oschina_soft/DataReporter.zip
    发表于 06-21 11:28 10次 阅读
    DataReporter数据上报框架

    pg_lightool PostgresSQL数据坏块修复工具

    ./oschina_soft/gitee-pg_lightool.zip
    发表于 06-21 11:15 12次 阅读
    pg_lightool PostgresSQL数据坏块修复工具

    输入事件和设备状态数据流介绍

    交互输入事件数据用来描述键盘、鼠标、触摸屏输入事件;键盘事件包括:按键码、按键时间戳、按键所属设备等....
    的头像 OpenAtom OpenHarmony 发表于 06-21 11:15 152次 阅读

    OpenHarmony原子化服务开发快速入门体验(中)

    四、编写项目代码 1.新新建一个文件夹common-images将部分照片放在images目录下,作....
    的头像 鸿蒙时代 发表于 06-21 11:11 178次 阅读
    OpenHarmony原子化服务开发快速入门体验(中)

    OpenHarmony原子化服务开发快速入门体验(上)

    目录: 一、体验说明 二、搭建开发环境 三、创建openHarmony新工程 四、编写项目代码 五、....
    的头像 鸿蒙时代 发表于 06-21 11:07 250次 阅读
    OpenHarmony原子化服务开发快速入门体验(上)

    啃论文俱乐部 | 压缩算法团队:我们是如何开展对压缩算法的学习

    关于OpenHarmony 啃论文俱乐部压缩算法团队 大家好!我是上海工程技术大学交通运输专业的一名大二学生,同时在 OpenAtom O...
    发表于 06-21 11:05 554次 阅读
    啃论文俱乐部 | 压缩算法团队:我们是如何开展对压缩算法的学习

    链上智能合约Dapp开发技术部署

      合约是代码(它的功能)和数据(它的状态)的集合,存在于以太坊区块链的特定地址。合约账户能够在彼此....
    的头像 搭建punk2558 发表于 06-20 18:13 76次 阅读

    派拓网络帮助企业了解和防范可能面临勒索软件威胁

    近日,全球网络安全领导企业 Palo Alto Networks(派拓网络)(纳斯达克代码:PANW....
    的头像 科技绿洲 发表于 06-20 17:21 352次 阅读

    立功科技空间域控解决方案满足日益增长数据量需求

    车载网络连接不断变化,以满足市场对更安全、更环保、更互联、甚至完全自动驾驶汽车日益增长的需求。为适应....
    的头像 科技绿洲 发表于 06-20 17:11 353次 阅读
    立功科技空间域控解决方案满足日益增长数据量需求

    MySQL用limit为什么会影响性能

    有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查....
    的头像 Linux爱好者 发表于 06-20 16:31 174次 阅读

    CBCT图像中的运动伪影成因

    运动伪影作为CBCT拍摄中最常见的伪影现象,受重视程度远低于金属伪影等其它类型伪影。究其原因还是因为....
    的头像 科技绿洲 发表于 06-20 15:34 532次 阅读

    新华三AD-NET解决方案赋能行业全面迈入云智原生时代

    近日,国际数据公司IDC发布《中国IT统一运维软件市场报告,2021H2》,报告显示,紫光股份旗下新....
    的头像 科技绿洲 发表于 06-20 11:11 335次 阅读

    广电运通以创新技术赋能粤港澳大湾区数字经济发展

    近日,广州市“百企千人”港澳大学生实习计划项目圆满结束,广电运通凭借优质的杰出人才引进服务以及创新的....
    的头像 科技绿洲 发表于 06-20 10:26 296次 阅读

    立得数字孪生真图立体防控解决方案为社会治安防控搭建数字孪生底座

    近日,立得空间承建的深圳市福田区重点部位信息采集及立体防控项目竣工验收。  
    的头像 科技绿洲 发表于 06-20 09:30 248次 阅读

    用小凌派RK2206开发板实现基于OpenHarmony阿里云IoT服务的教程

    一、MQTT协议简介 MQTT(消息队列遥测传输)是一个基于客户端-服务器的消息发布/订阅传输协议,....
    的头像 海阔天空的专栏 发表于 06-17 17:33 478次 阅读
    用小凌派RK2206开发板实现基于OpenHarmony阿里云IoT服务的教程

    OpenHarmony 3.1 Release版本详细了解新图形框架

    通常来讲,UI 界面显示分为两个部分:一是描述的UI元素在应用内部显示,二是多个应用的界面在屏幕上同....
    的头像 OpenAtom OpenHarmony 发表于 06-17 11:38 178次 阅读

    OpenHarmony打造了一款新的音视频引擎——HiStreamer

    数字多媒体技术在过去的数十年里得到了飞速的发展,音乐、电话、电视、电影、视频会议等等,伴随着我们度过....
    的头像 OpenAtom OpenHarmony 发表于 06-17 11:31 155次 阅读

    拓维信息荣获“华为云优秀云解决方案提供商”

    6 月 15 日,以“因聚而生 为你所能”为主题的华为伙伴暨开发者大会2022(HPDC 2022)....
    的头像 科技绿洲 发表于 06-17 11:00 237次 阅读

    拓维信息携手华为助力千行百业数字化转型

    以“因聚而生 为你所能”为主题的华为伙伴暨开发者大会2022(HPDC 2022)盛大召开。本届大会....
    的头像 拓维信息 发表于 06-17 10:04 205次 阅读

    上邦医疗与数码大方合作CAXA 3D+PLM协同管理项目正式启动

    近日,重庆上邦医疗设备有限公司(以下简称“上邦医疗”)CAXA 3D+PLM协同管理项目正式启动。本....
    的头像 科技绿洲 发表于 06-16 14:13 239次 阅读

    统信软件与OpenHarmony深度合作共筑自主智能终端场景新生态

    6月,统信智能终端操作系统V20顺利通过OpenAtom OpenHarmony(以下简称:Open....
    的头像 科技绿洲 发表于 06-16 11:52 321次 阅读

    开源SPL的出现,将使报表数据准备的困难得到巨大的改观

    从报表工具的眼光上看,数据准备属于报表之外的事情,可以堂而皇之地拒绝处理。但是,拒绝不等于不存在,这....
    的头像 数据分析与开发 发表于 06-16 11:03 217次 阅读

    从数据结构和算法解析OpenHarmony的事件机制

    近年来,国内开源实现跨越式发展,并成为企业提升创新能力、生产力、协作和透明度的关键。作为 OpenA....
    的头像 OpenAtom OpenHarmony 发表于 06-16 09:46 225次 阅读

    DLVC基于深度学习的视频编码

    ./oschina_soft/DLVC.zip
    发表于 06-16 09:26 6次 阅读
    DLVC基于深度学习的视频编码

    最佳的10名Python机器学习库

    根据官方介绍,Awkward Array用于嵌套的、大小不一的数据,包括任意长度的列表、记录、混合的....
    的头像 人工智能与大数据技术 发表于 06-15 11:44 260次 阅读

    在检索任务中训练数据在推理时也大有用处

    有点类似 Prompt 学习,但本文主要关注有监督学习的设置。结果不仅效果很好,而且很容易扩展(只要....
    的头像 深度学习自然语言处理 发表于 06-15 10:57 187次 阅读

    浪潮全闪存储保障医院关键系统需求可靠性和性能

    为了适应现代化医院的医疗、科研、教育和管理的要求,现代化的医院建立了以HIS、EMR、LIS(实验室....
    的头像 科技绿洲 发表于 06-15 09:50 883次 阅读

    eCapture用户态数据捕获工具

    ./oschina_soft/ecapture.zip
    发表于 06-15 09:19 13次 阅读
    eCapture用户态数据捕获工具

    SQL/JAVA/mybatisplus数据脱敏实现原理

    MYSQL(电话号码,身份证)数据脱敏的实现
    的头像 Android编程精选 发表于 06-14 17:09 330次 阅读

    CSP如何构建安全和云原生第三方安全

    客户和潜在客户通常会问,是采用云平台自行开发和提供的工具更好,还是购买第三方产品更好。答案当然不是二....
    的头像 科技绿洲 发表于 06-14 15:25 282次 阅读