tag 标签: OneOS

相关博文
  • 2021-12-3 15:47
    0 个评论
    OneOS成功入选2021年世界互联网领先科技成果手册!
    本文分享自世界互联网大会微信公众号: 2021年世界互联网大会《科技之魅》收录成果之中国移动OneOS物联网操作系统 。 OneOS是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,能够有效提高开发效率并降低开发成本,帮助用户开发稳定可靠、安全易用的物联网应用。 成果名称:中国移动OneOS物联网操作系统 成果单位:中移物联网有限公司 操作系统是信息产业的基础,也是物联网产业竞争的核心。物联网操作系统打通硬件和软件的通路,在实现功能之上更有保障安全和可靠性的重要价值。 OneOS是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,支持ARM Cortex-M/R/A、MIPS、RISC-V等主流CPU架构,兼容POSIX、CMSIS等标准接口,支持MicroPython等高级语言开发,提供图形化开发工具,能够有效提高开发效率并降低开发成本,帮助用户开发稳定可靠、安全易用的物联网应用。OneOS总体架构采用分层式设计,主体由驱动、内核、组件、安全框架组成。采用一个轻量级内核加多个系统组件的模式,加上超过800款市场主流MCU芯片及其他硬件的适配支持,使OneOS具备极高的市场拓展空间。 OneOS在安全性、NB网络、端云一体以及5G消息方面具有行业领先优势: 全面的安全设计:针对物联网设备资源受限、海量连接、网络异构等特点,参考等保2.0及《GB/T 36951-2018 信息安全技术物联网感知终端应用安全技术要求》等规范,在系统安全、通信安全、数据安全等方面提供多维度安全防护能力。OneOS拥有整体的安全框架,端到云整体安全设计。终端侧基于可信根构建安全能力,实现安全启动、安全升级、认证加密等功能,提供轻量级密码算法库,支持国密SM2/3/4算法;提供(D)TLS-1.3通信协议组件,保障传输安全;多种安全云服务,满足设备身份认证、数据加密等安全需求。其中高可靠高安全方面,在取得PSA Level1双认证的基础上,持续向行业关键认证进军,目前EAL 4+认证,国密一级认证,IEC 61508认证已经进入认证受理阶段 ,预计2021年内取得认证。 基于NB-IoT网络的智能表计行业能力: OneOS基于NB网络的技术积累,联合表计行业龙头企业,在多传感器数据融合、边缘计算能力、物联网安全应用、深度低功耗定制等方向深度合作,打造智能表计标杆应用。其中首个生态应用产品山东科德KD-NBIoT型智能水表已累计出货突破10万台。 端云一体赋能智能家居行业能力: OneOS联合OneNET开放平台,在端侧通过底层协议、中间件等技术解耦软硬件,实现智能家居设备的统一管理,为上层应用开发提供基础平台;在云侧原生接入OneNET物联云,结合无感配网、互联互通等能力,构建“软件定义家庭”的新型智能家居市场入口,推动家庭业务多元升级。 5G消息组件能力: OneOS通过提供5G消息组件和云端配置平台,让厂商能够免开发快速将设备智能化。通过5G消息组件,可对设备进行配网、控制等一系列操作,并提供直达、便捷、大容量、内容丰富的视频化富媒体信息服务,赋能多行业智能设备厂商。 操作系统是技术基础设施的重要组成部分,在降低企业创新风险、激励企业加大创新投入中发挥着重要作用,为行业技术升级提供坚实的基础保障。目前,OneOS操作系统已与市场主流芯片厂商如意法半导体、恩智浦、兆易创新等达成战略合作,并在智能表计、智能家居、智能穿戴、智能工控等领域推出更加适宜行业需求的解决方案,并联合以上行业的头部企业如海尔、共同探索行业标准,共同推进技术创新实现行业赋能。 编辑 | 赵哲楠 来源 | 世界互联网大会官网 阅读原文 OneOS已通过IEC 61508认证 OneOS官网: https://os.iot.10086.cn/
  • 热度 21
    2021-11-29 17:00
    2610 次阅读|
    0 个评论
    OneOS 定位功能测评+开发详解
    本文分享自中移OneOS微信公众号《定位功能测评+开发详解》。 本期严同学为了给大家展现 OnePos定位服务能力 复现地铁轨迹线路 坐了大半天的地铁 老辛苦了 这期视频大家一定要看看喔 点此跳转展示视频 想要一比一复原开发流程的小伙伴 可以看下面的讲解 绝对的干货 手把手教学(包会) 学不会找我哦 点此跳转讲解视频 演示视频流程 OnePos定位平台简介 OnePos位置服务平台是一套为搭载OneOS的智能硬件设备提供端对云/云对云服务的高精度定位平台,可选择多种定位方式,同时支持WiFi/基站/惯性导航/GNSS解析等辅助定位手段。目前所有服务完全免费,企业用户可根据需求申请大额度的免费商用服务。 详细了解参考开发者文档:OnePos定位-总体介绍 OnePos位置平台接入 OnePos位置平台创建设备的步骤包括以下几点: 1. OneOS官网注册账号 2. 登录OnePos平台 3. 进入产品管理 4. 创建产品 5. 创建设备(记录设备ID与设备Key) 6. 接入测试 详细的操作说明文档参考开发者文档:OnePos定位-端对云部分进行学习。 OneOS定位应用开发 环境准备 目前OneOS代码已经开源,开发者可以前往OneOS仓库或者 OneOS官网进行下载。 OneOS-Cube是OneOS操作系统基于命令行的开发工具,提供系统配置、项目编译构造、包贡献下载等功能。OneOS-Cube工具的下载及使用说明可以查阅 OneOS-Cube环境搭建进行学习。 工程配置 OnePos定位服务依赖的组件包括:MQTT组件、cJSON组件、Molink组件; 使用图形化工具menuconfig.bat进行工程配置: 1. MQTT组件 OnePos组件与OnePos平台通信通过MQTT协议进行,开发者可以通过OneOS Cube中的menuconfig图形化界面工具的将MQTT组件集成到自己的应用中,MQTT组件的配置如下: 详细请查阅MQTT参考文档进行了解 2. cJSON组件 OnePos组件与OnePos平台交互数据采用JSON格式封装,OneOS操作系统通过cJSON组件提供JSON格式数据创建和解析的能力,cJSON组件的配置如下: 详细说明请访问cJSON进行学习 3. Molink组件 OnePos服务原理是利用周围的网络环境数据进行定位的,网络环境数据的获取以及与平台通信的能力是由Molink提供的;本文以CAT1模组ML302和WIFI模组esp8266为例进行网络数据的获取与通信。 Molink的详细使用方法请参考MolinkAPI 4. OnePos组件 OnePos定位组件需要配合OnePos位置服务平台使用,可以对使用OneOS操作系统的开发者提供基础定位能力; 目前服务支持的能力有:Wi-Fi定位、基站定位、卫星定位。 注意:在配置OnePos服务的设备密钥时需要将定位平台分配的设备Key进行MD5(32位小写加密),然后将加密后的配置为OnePos组件的密钥;OnePos组件详细使用方法请参考OnePos定位端侧文档。 完成上述MQTT、cJSON及Molink组件的配置后,在OneOS-Cube工具中使用命令scons --ide=mdk5更新MDK工程设置。 系统成功运行! 应用示例 编写如下示例的定位应用代码进行OnePos定位服务的试用。 源文件:main.c 1. #include 2. #include 3. #include 4. #include 5. #include 6. #include 7. #include 8. 9. #include 10. 11. #ifdef OS_USING_ST7789VW 12. #include "cmcclogo.h" 13. #include "oneposimage.h" 14. #include "st7789vw.h" 15. 16. #define CMCC_LCD_TIME_ROW_SP 65 17. #define CMCC_LCD_TIME_ROW_H 50 18. #define CMCC_LCD_TIME_LCOLUMN_SP 65 19. #define CMCC_LCD_TIME_RCOLUMN_SP 110 20. 21. #define SHOW_COLOR_RED 0xFA27 22. #define SHOW_COLOR_GREEN 0x1546 23. #define SHOW_COLOR_YELLOW 0xFD20 24. 25. static void oneos_lcd_show_startup_page(void) 26. { 27. /* show CMCC logo */ 28. lcd_show_image(20, 50, 200, 61, gImage_cmcc); 29. lcd_show_image(20, 150, 200, 52, gImage_oneos); 30. } 31. 32. static void oneos_lcd_show_position(void *arg) 33. { 34. char *str = OS_NULL; 35. char time_get_now = {0,}; 36. time_t now = {0,}; 37. os_int32_t j = 0; 38. static char lat_show = {0,}; 39. static char lon_show = {0,}; 40. static onepos_pos_t pos_data = {0,}; 41. 42. lcd_clear(BLACK); 43. lcd_show_image(0, 0, 240, 240, gImage_onepos); 44. 45. while(1) 46. { 47. /* Get position */ 48. onepos_get_latest_position(&pos_data); 49. 50. /* Get time */ 51. now = time(OS_NULL); 52. str = ctime(&now); 53. 54. snprintf(lat_show, 24, "%f", pos_data.lat_coordinate); 55. snprintf(lon_show, 24, "%f", pos_data.lon_coordinate);\ 56. 57. for(j = 11; j < 19; j++) 58. { 59. time_get_now = str ; 60. } 61. time_get_now = '\0'; 62. 63. lcd_set_color(SHOW_COLOR_RED, BLACK); 64. lcd_show_string(CMCC_LCD_TIME_LCOLUMN_SP + 30, CMCC_LCD_TIME_ROW_SP + CMCC_LCD_TIME_ROW_H * 0 + 3, 24, time_get_now); 65. lcd_set_color(SHOW_COLOR_GREEN, BLACK); 66. lcd_show_string(CMCC_LCD_TIME_LCOLUMN_SP + 30, CMCC_LCD_TIME_ROW_SP + CMCC_LCD_TIME_ROW_H * 1 + 15, 24, lat_show); 67. lcd_set_color(SHOW_COLOR_YELLOW, BLACK); 68. lcd_show_string(CMCC_LCD_TIME_LCOLUMN_SP + 30, CMCC_LCD_TIME_ROW_SP + CMCC_LCD_TIME_ROW_H * 2 + 30, 24, lon_show); 69. 70. os_task_mdelay(50); 71. } 72. } 73. #endif 74. 75. /* defined the LED0 pin: PD12 */ 76. #define LED0_PIN GET_PIN(D, 12) 77. 78. int main(void) 79. { 80. os_uint32_t count = 0; 81. os_task_t *lcd_show_task = OS_NULL; 82. 83. os_kprintf("Enter main function, here is the onepos code!\n"); 84. 85. #ifdef OS_USING_ST7789VW 86. oneos_lcd_show_startup_page(); 87. os_task_mdelay(500); 88. #endif 89. 90. #ifdef PKG_USING_NTP 91. /* wait ntp sync */ 92. extern time_t ntp_sync_to_rtc(const char *host_name); 93. ntp_sync_to_rtc(OS_NULL); 94. os_task_mdelay(500); 95. #endif 96. 97. count = 1; 98. /* set LED0 pin mode to output */ 99. os_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); 100. 101. /* start onepos sever and wait once position */ 102. while(ONEPOS_CLOSING == onepos_get_server_sta()) 103. { 104. onepos_start_server(); 105. os_task_mdelay(5000); 106. } 107. /* creat lcd show task */ 108. lcd_show_task = os_task_create("lcd_show", oneos_lcd_show_position, 109. OS_NULL, 110. 2048, OS_TASK_PRIORITY_MAX / 2 - 4, 50); 111. 112. if (lcd_show_task != OS_NULL) 113. { 114. os_task_startup(lcd_show_task); 115. } 116. 117. while (count++) 118. { 119. os_pin_write(LED0_PIN, PIN_HIGH); 120. os_task_mdelay(400); 121. os_pin_write(LED0_PIN, PIN_LOW); 122. os_task_mdelay(400); 123. } 124. 125. return OS_EOK; 126. } 头文件:oneposimage.h 百度网盘: 【https://pan.baidu.com/s/1ZYIirm7aA4qbFyHYB2_yWw】 【提取码:ppad】 在演示视频中直接用以上演示程序替换基础工程中的main.c; 由于演示功能包含实时时间显示的功能,需要使用NTP服务进行时间同步; 所以再配置一次工程:开启ntp服务; 然后编译与烧录程序; 在OnePOS平台查询设备的位置信息: OneOS: OneOS是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,支持ARM Cortex-M/R/A、MIPS、RISC-V等主流CPU架构,兼容POSIX、CMSIS等标准接口,支持Micropython语言开发,提供图形化开发工具,能够有效提高开发效率并降低开发成本,帮助客户开发稳定可靠、安全易用的物联网应用。 官网地址:https://os.iot.10086.cn/
  • 热度 14
    2021-11-25 14:38
    2087 次阅读|
    0 个评论
    本文分享自中移OneOS微信公众号《 应用MoLink框架快速实现网络连接 》,作者:柏灵。 MoLink简介 1.1 MoLink是什么 Molink即ModuleLinkKit (模组连接套件)。MoLink是一整套针对嵌入式模组开发套件。MoLink提供了模组多实例管理、模组功能适配并向开发者提供统一易用的API(应用程序接口)。 同时,OneOS OpenCPU模组方案完全兼容Molink API接口,通过统一的API接口实现MCU+模组和模组OpenCPU方案间应用代码 的无缝迁移。 1.2 传统嵌入式模组适配开发难点及不便 1)需要关注到具体的指令收发和解析并参与管理: · 模组适配工作量大 · 调试复杂维护不便 2)不同厂商、型号间AT指令集存在差异: · 切换不同模组周期长,工作量大 · 优化升级十分困难 1.3 MoLink对嵌入式模组适配开发的帮助 管理方便:提供统一的模组管理,支持多模组多线程。 开发简单:接口简明易用,专注业务功能开发。 上手即用:适配主流模组,免除繁杂适配工作。 功能丰富:适配云平台连接等复杂功能。 快速切换:统一应用程序接口,模组一键切换。 提供套接字编程接口(部分)。 框架及能力介绍 2.1 MoLink框架介绍 MoLink框架从上至下分为4层,分别为: 1)抽象接口层:提供通用控制、网络服务、网络连接、套接字、Wi-Fi管理等多种接口的定义及高层实现 2)核心层:提供Molink模组对象定义、模组实例的管理及其他关键部分实现 3)模组适配层:提供各种型号通信模组的抽象接口层各种接口的适配函数实 4)AT 解析器:可选模块,MCU架构下的模组适配通过AT解析器接管串口等设备并与与通信模组进行AT指令通信 2.1 MoLink能力介绍 MoLink代码结构目录如下: MoLink拥有以下能力: 1)实例的管理功能,包括创建、获取、删除等功能; 2)通用控制功能,包括获取IMEI号码,获取ICCID号码等功能; 3)网络服务功能,包括附着、注网、获取信号质量等功能; 4)TCP/IP,包括基础的TCP/UDP连接的创建、连接、发送、接受、断开连接等功能; 5)Soker套接字功能,基于TCP/IP相关接口的基础,封装套接字接口,向上可由net/socket组件开启并支持标准BSD socker接口; 6)调试功能,包括ifconfig、ping等操作。 应用MoLink快速实现网络连接 3.1前期准备 硬件支持 本次开发使用的是正点原子潘多拉开发板,采用超低功耗高性能的主控制器 STM32L475,板载1.3寸 TFT显示屏,集成STLink,多样化的扩展接口使其可连接多种模块如蓝牙、Lora、GPS等,硬件资源丰富。 模组选择的是ML302,ML302 是中国移动最新推出的 LTE Cat.1 模块。ML302 支持 TD- LTE/FDD- LTE 通信制式,具有丰富的 Internet 协议、行业标准接口和功能,支持 Windows、Linux 和 Android 驱动。 本实验中,潘多拉开发板的UART2和ML302的AT串口通过杜邦线相连(选杜邦线的原因真的是因为方便哈,并不是因为穷, 虽然小编确实很穷 ≥﹏≤)。 软件获取 OneOS是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,支持ARM Cortex-M/R/A、MIPS、RISC-V等主流CPU架构,兼容POSIX、CMSIS等标准接口,支持Micropython语言开发,提供图形化开发工具,能够有效提高开发效率并降低开发成本,帮助客户开发稳定可靠、安全易用的物联网应用。小伙伴们可以通过码云下载代码体验。链接如下: CMCC-OneOS OneOS-Cube 3.2配置与编译 OneOS-Cube配置 MoLink 组件相对独立,在使用时,只需要在menuconfig中开启Molink组件即可。在Components → Network → Molink→ Modules中,选择4G CAT1 Modules 中的ML302模组。 (Top) → Components → Network → Molink → Enable IoT modules support → Modules → 4G CAT1 Modules Su→ ML302 → ML302 ConfigConfig Enable ML302 Module Object Auto Create -*- Enable ML302 Module General Operates -*- Enable ML302 Module Network Service Operates Enable ML302 Module Ping Operates Enable ML302 Module Ifconfig Operates Enable ML302 Module Network TCP/IP Operates Enable ML302 Module BSD Socket Operates 我们看到,进入ML302 Module选项后,第一个就是自动创建模组选项;在一般情况下,选择自动创建模组,配置好串口号,波特率,最大AT命令接收长度选项; Enable ML302 Module Object Auto Create (uart2) ML302 Interface Device Name (115200) ML302 Interface Device Rate (512) The maximum length of AT command data accepted 可是,也晓得有的小伙伴就是不想自动创建模组,要自己动手,丰衣足食,那么直接撸代码,创建一个模组对象。 首先,我们要调用 os_device_find() 函数,找到对应的串口,然后再配置波特率、最大AT命令接收长度选项等选项,最后调用 mo_create() 来创建模组。 test_device = os_device_find("uart2"); if (OS_NULL == test_device) { LOG_E(ATEST_TAG,"Can not find interface device uart2uart2!"); } uart_config.baud_rate = 115200; os_device_control(test_device, OS_DEVICE_CTRL_CONFIG, &uart_config); parser_config.parser_name = "ml302"; parser_config.parser_device = test_device; parser_config.recv_buff_len = 512; os_device_control(test_device, OS_DEVICE_CTRL_CONFIG, &uart_config); if (OS_NULL == test_module) { test_module = mo_create(ModulesPara.ModuleName,ModulesPara.Type, &parser_config); } 同时,打开Molink 目录下的Tools,里面有我们调试的小工具,有ifconfig 、ping、socket stat等功能,后面有用到哦。 (Top) → Components → Network → Molink → Enable IoT modules support → Tools Enable AT module network debug functions Enable molink ifconfig features Enable molink ping features (50) The maximum times of molink ping cmd config Enable molink socket stat feature 编译与下载 进入 projects\stm32l475-atk-pandora 目录,打开OneOS-Cube命令行,执行命令 scons --ide=mdk5 生成并更新keil项目工程文件,双击 project.uvprojx ,打开MDK工程,点击左上角的 Build 按钮,等待编译完成。当看到 0 Error(s), 0 Warning(s) 的输出时说明编译完成。 确保潘多拉开发板已和电脑相连接。此时点击左上角的 Download 按钮,将程序下载到开发板中。但看到 Programming Done. Flash Load finished 则表明程序已经烧写成功。 这时,小伙伴们就可以使用Molink组件的功能啦。我们可以直接在自己的应用程序中调用接口,也可以使用我们提供的shell命令。 3.3 MoLink快速联网 入网检测 当程序下载成功后,把程序跑起来;通过串口助手连接潘多拉的调试串口,可以发现了Molink的第一个特点:屏蔽底层模组,在创建模组对象后自动驻网。 I/ml302: Module ml302 network is registered I/ml302: Auto create ml302 module object success! 所以,不管你是自动 创建模组对象,还是手动创建,都是创建时自动驻网,就不需要你对着模组AT手册一步一步的发送AT指令去驻网了,是不是很棒呢? 当然,我们要确定模组是不是真的驻网成功,还可以通过小工具校验,这就是我们上面选择tools的小工具哦。可以通过ifconfig,查看模组是否获取到本地IP,还可以查看信号强度,模组IMEI等信息。 ifconfig LIST AT MODULE INFORMATION -------------------------------------------------------------------------------- Module Name : ml302 IMEI Number : 863293057223775 ICCID Number : 898604640119C1755639 Signal Quality : rssi(28), ber(99) IPv4 Address : 10.112.250.233 -------------------------------------------------------------------------------- ping的功能也很好用哦,是查看网络畅通与否的最佳小助手。 ping www.baidu.com Ping statistics for 183.232.231.172 : Packets: Sent = 4, Received = 4, Lost = 0, Mintime = 73 ms, Maxtime = 145 ms, Avgtime = 104 ms 快速连网 入网成功后,要开始连网。这里也有两种选择,调用Molink的原生接口,或者走socket接口。如果要走socket接口,注意在Module选项里勾选BSD socket相关选项哦。 如果调用Molink的原生接口,首先调用 mo_netconn_create() 创建连接对象,接着调用 mo_netconn_connecte() 与对应的IP和端口建立连接,此时连网完成。验证一下发送和接受功能,调用 mo_netconn_send() 发送数据,再调用 mo_netconn_recv() 接受数据,两相比较,发送数据和接受数据一致,通过验证,该网络链路可以正常使用,快速连网完成。 (PS:为了方便验证,此次我们测试的IP端口是接收什么消息就回复相同消息,小伙伴们可以作参考哦) test_netconn = mo_netconn_create(test_module, NETCONN_TYPE_UDP); tp_assert_not_null(test_netconn); os_err_t result = mo_netconn_connect(test_module, test_netconn, server_addr, TEST_SERVER_TCP_PORT); tp_assert_true(OS_EOK == result); os_size_t sent_size = mo_netconn_send(test_module, test_netconn, TEST_MSG, strlen(TEST_MSG)); 0); result = mo_netconn_recv(test_module, test_netconn, &data_ptr, &data_size, OS_WAIT_FOREVER); tp_assert_true(OS_EOK == result); tp_assert_true(data_size == strlen(TEST_MSG)); 如果使用socket接口,首先调用 mo_socket() 创建socket,接着调用 mo_connecte() 与对应的IP和端口建立连接,并且调用 mo_setsockopt() 接口设置接收超时时间,此时连网完成。 测试代码与上面代码相同,只是发送和接受函数略有变化,小伙伴可以自行研究其中的奥秘哦。 struct sockaddr_in addr = {0}; addr.sin_family = AF_INET; addr.sin_port = htons(TEST_TCP_PORT); h_addr); memset(&(addr.sin_zero), 0, sizeof(addr.sin_zero)); int socket_id = mo_socket(test_module, AF_INET, SOCK_STREAM, 0); = 0); os_int32_t result = mo_connect(test_module, socket_id, (struct sockaddr *)&addr, sizeof(struct sockaddr)); tp_assert_true(0 == result); result = mo_setsockopt(test_module, socket_id, SOL_SOCKET, SO_RCVTIMEO, &recv_time, sizeof(recv_time)); sent_size = mo_send(test_module, socket_id, TEST_MSG, strlen(TEST_MSG), 0); 0); recv_size = mo_recv(test_module, socket_id, recv_buff, strlen(TEST_MSG), 0); 0); 常见问题 Q): 如果模组创建后驻网失败怎么办? A): 模组创建时候会主动驻网,但如果因为网络环境较差,或者其他原因没有驻网成功,可以使用以下步骤进行重新驻网哦。其中test_module是创建的模组对象,cid是你打算激活的第几路id,一般默认为1。 tp_assert_true(OS_EOK == ret); tp_assert_true(OS_EOK == ret); ret = mo_set_attach(test_module, 1); tp_assert_true(OS_EOK == ret); ret = mo_set_cgact(test_module, cid, 1); tp_assert_true(OS_EOK == ret); Q): Molink传输速率如何? A): Molink的传输速率主要和两个因素有关。第一个是串口波特率,一般串口波特率默认为9600,或者115200,所以导致在高速4G网络传输情况下,因为串口速率满足不了而导致丢失数据;第二就是模 组本身特性,如NB模组本身就是应对低速率的环境,高速速率传输问题较大。 Q): 是否适配或者计划适配5G模 组? A): 5G模组适配已经纳入规划。因为目前Molink走 的都是串口通信,5G网络的高速率无法通过串口实现;目前正在计划使用USB做AT通信,小伙伴们请拭目以待哦。 Q):Molink 默认配置下存在数据丢失 情况? A): 在OneOS操作系统中串口缓存区的大 小默认为64bytes,如果使用Molink组件则建议将串口缓冲区调大(建议调为2048)。 Serial Enable serial drivers (2048) Set RX buffer size Serial 更多关于MoLink的介绍,可以去 OneOS学院 查看哦!
  • 热度 16
    2021-11-22 15:08
    2602 次阅读|
    0 个评论
    OneOS文字转语言组件实操 | 当万耦遇上chaoTTS
    本文分享自中移OneOS微信公众号 《当万耦遇上chaoTTS》 ,作者:柏灵。 大家好,柏灵又又又来啦!!相信大家已经开始在寒冷的冬季种植鲜嫩的豌豆尖,火锅里烫上豌豆尖,从此打工人有了豌豆尖自由!(还没有种植的小伙伴,可以通过OneOS 基于端云融合能力 | “种植环境监测器”技术细节学习哦)小伙伴们真是棒棒哒。打工人,打工魂,打工才是人上人,吃饱喝足走一波,吃着火锅唱着歌。作为自嗨型灵魂歌手,柏灵拿出了真正的实力,chaoTTS! chaoTTS是个啥? chaoTTS组件 提供了丰富的文字转语音功能。执行逻辑是:通过httpclient组件把文字发送到云上AI,使用云上AI的语音合成功能,生成音频文件,并下载到模组,使用音频驱动播放。 chaoTTS组件 向用户层提供简洁易用的操作接口,实现了以下功能,方便用户使用组件相关功能。 • 接入云上AI功能 • 在线文字转语音功能 • 支持设置人声、语速、音调、音量、cuid值 • 支持设置下载的文件格式功能(默认为wav格式) • 提供了相应的shell命令和at指令,方便用户使用 前期准备 2.1 硬件支持 本次开发使用万耦创世L475开发板,它的主频最高80MHz,1024K FLASH ,128K SRAM。主要的外设资源,如各类接口,各类传感器等,都位于底板上。除了开发板之外,还需准备J-Link用于下载运行,以及准备一张SD card和一个耳机。 详情可参见OneOS官网对 万耦开发板 的详细介绍。 2.2 软件获取 OneOS是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,支持ARM Cortex-M/R/A、MIPS、RISC-V等主流CPU架构,兼容POSIX、CMSIS等标准接口,支持Micropython语言开发,提供图形化开发工具,能够有效提高开发效率并降低开发成本,帮助客户开发稳定可靠、安全易用的物联网应用。小伙伴们可以通过码云下载代码体验。链接如下: CMCC-OneOS OneOS-Cube 配置开发 3.1 OneOS-Cube配置 chaoTTS 组件依赖于云上AI、httpclient组件、OpenCC组件,以及audio驱动。因此,需要做以下准备: • menuconfig中开启httpclient组件、OpenCC组件和chaoTTS组件 • 这里以百度AI为例,用户注册 百度AI开发平台 ,并创建其语音识别应用 • 硬件支持音频播放,另外准备一张SD card,以及一个耳机 • 支持文件系统,支持创建、读、写、删除文件操作 使用menuconfig,开启httpclient组件、开启文件系统组件、OpenCC组件和chaoTTS组件。 Httpclient Enable Httpclient TLS encrypt Enable HTTPCLIENT sample (5000) HTTP SET RECV TIMEOUT MS Using working directory (2) The max number of mounted file system (2) The max number of file system type (16) The max number of opened files Enable JFFS2 Enable FatFs ... Enable tts aivoice Enable tts aivoice sample (/tts.wav) the tts audio file name (500) tts text max length (1024) tts buf and file size openCC Enable Character Conversion Function Enable sample chaoTTS的网络连接支持有线连接和无线连接两种方式。这里以WiFi模组ESP8266为例,配置如下: Enable ESP8266 module object auto create (uart1) ESP8266 interface device name (115200) ESP8266 interface device name (3000) The maximum length of AT command data accepted Enable ESP8266 module auto connect ... 3.2 注册百度AI 这里以百度AI平台为例。注册百度AI开发平台,创建语音识别应用。只需 三步 ,即可完成语音合成接口的调用,让您的应用“开口说话”。具体方法可参见 语音合成 。目的是为了获取到 API KEY 以及 Secret KEY ,用于接口调用连接百度AI平台。 编译、下载、运行 进入projects\stm32l475-cmcc-oneos目录,打开OneOS-Cube命令行,执行命令scons --ide=mdk5生成并更新keil项目工程文件,双击project.uvprojx,打开MDK工程,点击左上角的 Build 按钮,等待编译完成。当看到0 Error(s), 0 Warning(s)的输出时说明编译完成。 确保jlink已和万耦开发板,以及电脑相连接。此时点击左上角的 Download 按钮,将程序下载到开发板中。但看到Programming Done. Flash Load finished则表明程序已经烧写成功。 这时,小伙伴们就可以使用chaoTTS组件的功能啦。我们可以直接在自己的应用程序中调用接口,也可以使用我们提供的shell命令。 4.1 shell命令使用 联网:使用ifconfig查看是否网络连接成功 初始化:tts_aivoice_init tA5BrPmeq5xekai4dfy4bWKs nAXS4j14zKnRFArmRiGLnCQz2E8TyVmS 文字转语音:tts_aivoice_player 太冷了,在家种豌豆尖烫火锅撒 设置人声:tts_aivoice_per 4 演示视频: 点击跳转 注意 :tts_aivoice_init后面跟的是自己在百度AI获取到的 API KEY 以及 Secret KEY 。因为录制的是耳机声音,可能会比较小,需要小伙伴们调大音量。 常见问题 Q): 为何使用shell命令无法使用chaoTTS组件功能? A): 如果需要在shell下使用ttsAiVoice组件功能,请调大shell任务的栈大小,可以在shell下通过task命令查看shell的栈最大使用率来进行调节。 Q): 为何输入文本太长,获取到的音频只有前面的一部分? A): 如果chaoTTS组件配置中,配置的tts文本长度不够,会出现该情况。请使用menuconfig调大以上值。 Q): 为何总是无法使用chaoTTS组件功能? A): 请确认已开启网络功能,且已联网成功。 Q): 为何获取到的音频有杂音? A): 在有线网络或者模组本身播放音频,不应出现此情况。如果是MCU外接wifi模组或者4G模组,因为要使用molink组件,所以请调大AT命令接收数据buffer的最大长度。可以通过打开DLOG日志,查看AT命令接收数据buffer长度是否不够。 也需考虑,是否内存空间不足,可以使用mem命令查看。请保留 10k以上 的RAM空间给chaoTTS使用。 最后,通信模组通过串口发送给系统的数据将会首先缓存在串口数据缓冲区中,因此,如果串口缓冲区大小设置过小则会导致Molink无法正确的接收通信模组发送的数据,造成AT指令执行超时或数据接收不全等问题。在OneOS操作系统中串口缓存区的大小默认为64bytes,如果使用Molink组件则建议将串口缓冲区调大。 Serial Enable serial drivers (1024) Set RX buffer size (64) Set TX buffer size References 万耦开发板: https://os.iot.10086.cn/doc/hardware_support/oneos_dev_board.html CMCC-OneOS : https://gitee.com/cmcc-oneos OneOS-Cube : https://os.iot.10086.cn/download/ 百度AI开发平台: https://ai.baidu.com/ 语音合成: https://ai.baidu.com/ai-doc/SPEECH/jk38y8gno
  • 热度 3
    2021-11-18 15:50
    2655 次阅读|
    2 个评论
    OneOS 基于端云融合能力 | “种植环境监测器”技术细节
    在冷冷的冬天 火锅配上豌豆尖 想想就很美 那就赶快行动起来 跟我们学习如何利用OneOS的端云融合能力种出更茂盛的豌豆尖吧~ 准备工具 : 万耦创世开发板*1 土壤湿度传感器*1 OneOS嵌入式操作系统 OneNET Studio 物联网开发平台 温湿度监测应用需要智能设备和云平台进行互联,在云平台上进行控制、管理和数据分析。OneOS在端侧以OneOS内核为基础,集成各类端云通信协议,屏蔽复杂通信过程,支持连接中国移动OneNET物联网数字感知能力中台和其他IoT平台,开发者可以通过OneOS提供的连接能力结合OneNET的开放能力及产品,快速打造端云融合的物联网应用。 本文通过使用标准MQTT协议接入OneNET 平台为例,展示OneOS快速上云,助力物联网产品快速开发。 OneNET Studio简介 OneNET Studio是一站式物联网开发平台,向下接入设备,向上承载应用。整合产业链上下游,向下整合终端设备接入与管理,向上延展物联网一站式应用开发,横向聚合增值能力,提供智能化数据分析,形成端到端完整链路物联网解决方案体系,打造物联网生态环境。 OneNET Studio快速入门 OneNET Studio快速入门主要包括以下几个步骤: •注册账号 •登录OneNET •进入控制台 •进入Studio平台 详细的说明可以访问 OneNET Studo快速入门 进行学习。 连接OneNET Studio MQTT协议 物联网平台支持标准MQTT协议和CoAP协议接入,是物联网的重要组成部分。MQTT是一种基于TCP构建的轻量级发布、订阅传输协议,适用于网络带宽有限的场景,同时其可以保持长连接,具有一定的实效性。 创建产品 OneNET Studio中产品是一组具有相同功能定义的设备集合,快速创建产品后可定义产品物模型、添加对应设备。进入Studio平台后,展开菜单栏中的「设备接入与管理」,点击「产品管理」,进入产品列表页面。点击「添加产品」,在弹出页面中,按照提示填写产品的基本信息,接入协议选择MQTT,完成产品创建。 详细的说明可以访问 创建产品 进行学习。 创建设备 物理设备要连接到平台,需要先在平台创建设备(支持单个或批量导入创建),并获取连接到平台的鉴权信息。进入Studio平台后,展开菜单栏中的「设备接入与管理」,点击「设备管理」,进入设备列表页面。点击「添加设备」,选中单个设备(默认方式)输入设备详情,点击「确定」创建设备。 生成接入Token 连接到平台需要鉴权参数,需要用到的参数如下: •ProductId:产品ID,平台生成唯一ID •DeviceName:设备名称 •Token:鉴权token Token的计算方法可以访问 设备安全认证 进行学习。 连接平台 使用MQTT客户端尝试连接平台,验证Token是否计算正确。 其中Client ID为在OneNET Studio中创建的设备名,用户名为产品ID,密码为计算后的Token。点击连接,当连接参数设置正确时将连接至平台,此时设备在页面上显示为在线状态。 自定义物模型 物模型 是对设备的数字化抽象描述,描述该型号设备是什么,能做什么,能对外提供哪些服务。物模型将物理空间中的实体设备数字化,在云端构建该实体的数据模型,即将物理空间的实体在云端进行格式化表示。本文以温/湿度传感器和光强/接近位置传感器的数据为例,进行物模型的定义。 点击「产品管理」页,产品列表中对应产品的「详情」操作,进入物模型设置页面,点击「设置物模型」,根据需求添加或选择物模型功能点,完成功能点编辑后,点击「保存」,使物模型模板生效。 本文自定义的物模型如上图所示,关于物模型详细说明可以访问 物模型 进行学习。 OneOS应用开发 OneOS及工具下载 目前OneOS代码已经开源,开发者可以前往 OneOS仓库 或者 OneOS官网 进行下载。 OneOS-Cube是OneOS操作系统基于命令行的开发工具,提供系统配置、项目编译构造、包贡献下载等功能。OneOS-Cube工具的下载及使用说明可以访问 OneOS-Cube环境搭建 进行学习。 硬件环境准备 本文使用OneOS官方的万耦创世L475开发板作为硬件平台。 万耦创世L475开发板使用了 STM32L475VGT6 芯片,STM32L4系列MCU可以根据微处理器运行时不同的应用需求来适时调整电压从而实现功耗的动态平衡。该功能适用于STOP模式下的低功耗外设(LP UART、LP定时器)、安全和保密特性、大量智能外设,以及诸如运算放大器、比较器、LCD、12位DAC和16位ADC(硬件过采样)等先进的低功耗模拟外设。 关于万耦开发板详细的文档说明可以参考 万耦开发板开发文档 软件环境准备 万耦开发板的示例工程需要准备以下的软件环境: •MDK 开发环境 安装 MDK-ARM 5.27 (正式版或评估版,5.14 版本及以上版本均可),推荐使用keil最新版本,避免不必要的问题,安装方法可以参考 Keil MDK安装。 •连接并安装Jlink驱动,便于进行下载调试; 为了深入开发流程,开发者可以使用本文提供的空白示例工程进行开发,一步一步的完成一个简易物联网应用的开发。 点亮万耦开发板 完成万耦开发板的硬件连接,如下图所示: 将本文提供的空白示例工程解压缩后放置在 OneOS/projects 目录下,如下图所示: 进入 stm32l475-cmcc-oneos-demo 目录下,打开MDK工程,点击左上角的 Build 按钮,等待编译完成。 当看到 0 Error(s), 0 Warning(s) 的输出时说明编译完成,此时点击左上角的 Download 按钮,将程序下载到开发板中。 当程序下载完成后,串口将输出 Hello OneOS! ,代表开发板中的程序运行成功! 读取传感器数据 OneOS在各类外设的基础上抽象出了设备驱动模型,有效提高了代码可复用性、可移植性,模块分层解耦,降低了各层的开发难度。 本文将使用OneOS中Sensor框架提供的API读取万耦开发板上板载的AHT10温/湿度传感器和AP3216C光强/接近位置传感器的数据。 Sensor框架配置 在stm32l475-cmcc-oneos-demo右键打开OneOS-Cube工具,使用menuconfig进行Sensor框架的配置,配置如下所示: (Top) → Drivers→ I2C Using I2C device drivers Use GPIO to simulate I2C (10) simulate I2C bus delay(us) Enable I2C1 BUS (software simulation) ---- Enable I2C2 BUS (software simulation) ---- Enable I2C4 BUS (software simulation) ---- (Top) → Drivers→ Sensors Using sensor device drivers Enable sht20 ---- (soft_i2c3) aht10 i2c bus name (0x38) aht10 i2c addr(7bit) Enable adxl345 ---- Enable bh1750 ---- Enable bmp180 ---- Enable ak8963 ---- Enable lsm6dsl ---- (soft_i2c3) ap3216c i2c bus name (0x1e) ap3216c i2c addr 完成配置后退出menuconfig并保存配置,使用命令 scons --ide=mdk5 更新MDK工程设置, 命令执行完成后重新打开MDK工程。 Sensor相关的代码和组将会被加到MDK工程中。在 main 函数中添加以下的代码,读取并打印传感器的数值。 /* 包含头文件 */ #include #include #include static os_device_t *sensor_temp = OS_NULL; static os_device_t *sensor_humi = OS_NULL; static os_device_t *sensor_light = OS_NULL; static os_device_t *sensor_ps = OS_NULL; /* 传感器初始化 */ static void sensor_init(void) { /* 根据传感器设备名称查找设备 */ sensor_temp = os_device_find("temp_aht10"); OS_ASSERT(sensor_temp != OS_NULL); sensor_humi = os_device_find("humi_aht10"); OS_ASSERT(sensor_humi != OS_NULL); sensor_light = os_device_find("li_ap3216c"); OS_ASSERT(sensor_light != OS_NULL); sensor_ps = os_device_find("pr_ap3216c"); OS_ASSERT(sensor_ps != OS_NULL); /* 打开传感器设备 */ os_device_open(sensor_temp, OS_DEVICE_FLAG_RDWR); os_device_open(sensor_humi, OS_DEVICE_FLAG_RDWR); os_device_open(sensor_light, OS_DEVICE_FLAG_RDWR); os_device_open(sensor_ps, OS_DEVICE_FLAG_RDWR); } int main(void) { printf("Hello, OneOS!\n"); struct os_sensor_data sensor_data; sensor_init(); /* 读取温度传感器数据 */ os_device_read(sensor_temp, 0, &sensor_data, sizeof(struct os_sensor_data)); printf("temp: %.2f\n", (double)sensor_data.data.temp / 1000); /* 读取湿度传感器数据 */ os_device_read(sensor_humi, 0, &sensor_data, sizeof(struct os_sensor_data)); printf("humi: %.2f\n", (double)sensor_data.data.humi / 1000); /* 读取光照传感器数据 */ os_device_read(sensor_light, 0, &sensor_data, sizeof(struct os_sensor_data)); printf("light: %.2f\n", (double)sensor_data.data.light / 1000); /* 读取接近传感器数据 */ os_device_read(sensor_ps, 0, &sensor_data, sizeof(struct os_sensor_data)); printf("ps: %d\n", sensor_data.data.raw); return 0; } 编译并下载到万耦开发板运行,可以通过串口看到打印的传感器数值。 关于OneOS驱动及Sensor设备的详细说明可以访问 Sensor设备用户开发 进行学习。 建立线程读取传感器 上面的示例代码只能读取和打印一次传感器数值,可以在OneOS中建立一个任务来循环读取和打印传感器数值。任务是 OneOS 操作系统中最小的调度单位。将上述的代码修改如下: ...... /* 传感器初始化 */ static void sensor_init(void) { ...... } static void sensor_read_entry(void *parameter) { struct os_sensor_data sensor_data; /* 循环读取传感器数据 */ while (1) { printf("---------Sensor Data--------\n"); /* 读取温度传感器数据 */ os_device_read(sensor_temp, 0, &sensor_data, sizeof(struct os_sensor_data)); printf("temp: %.2f\n", (double)sensor_data.data.temp / 1000); /* 读取湿度传感器数据 */ os_device_read(sensor_humi, 0, &sensor_data, sizeof(struct os_sensor_data)); printf("humi: %.2f\n", (double)sensor_data.data.humi / 1000); /* 读取光照传感器数据 */ os_device_read(sensor_light, 0, &sensor_data, sizeof(struct os_sensor_data)); printf("light: %.2f\n", (double)sensor_data.data.light / 1000); /* 读取接近传感器数据 */ os_device_read(sensor_ps, 0, &sensor_data, sizeof(struct os_sensor_data)); printf("ps: %d\n", sensor_data.data.raw); printf("----------------------------\n"); os_task_mdelay(3000); /* 延时3秒 */ } } int main(void) { printf("Hello, OneOS!\n"); sensor_init(); /* 创建传感器读取任务 */ os_task_t *sensor_read_task = os_task_create("sensor_read", sensor_read_entry, OS_NULL, 1024, 20, 5); if (sensor_task != OS_NULL) { os_task_startup(sensor_read_task); } return 0; } 编译并下载到万耦开发板运行,可以通过串口看到打印的循环读取的传感器数值。 关于OneOS任务管理及调度的详细内容可以访问 任务管理及调度 进行学习。 通过消息队列传递传感器数据 传感器读取任务读取的传感器数据可以保存在结构体中,然后发送至消息队列中进行保存。传感器处理任务可以从消息队列中读取传感器数据并进行处理。修改上述的示例代码中,新建一个消息队列和传感器处理线程,传感器处理线程从消息队列中读取数据并将数据按照指定的格式打印出来。 #include #include #include ...... static os_mq_t *sensor_mq = OS_NULL; typedef struct sensor_data { float temp; float humi; float light; int ps; } sensor_data_t; static void sensor_init(void) { ...... } static void sensor_read_entry(void *parameter) { struct os_sensor_data tmp_data; sensor_data_t data; /* 循环读取传感器数据 */ while (1) { /* 读取温度传感器数据 */ os_device_read(sensor_temp, 0, &tmp_data, sizeof(struct os_sensor_data)); data.temp = (float)tmp_data.data.temp / 1000; /* 读取湿度传感器数据 */ os_device_read(sensor_humi, 0, &tmp_data, sizeof(struct os_sensor_data)); data.humi = (float)tmp_data.data.humi / 1000; /* 读取光照传感器数据 */ os_device_read(sensor_light, 0, &tmp_data, sizeof(struct os_sensor_data)); data.light = (float)tmp_data.data.light / 1000; /* 读取接近传感器数据 */ os_device_read(sensor_ps, 0, &tmp_data, sizeof(struct os_sensor_data)); data.ps = tmp_data.data.raw; os_mq_send(sensor_mq, &data, sizeof(sensor_data_t), OS_IPC_WAITING_FOREVER); os_task_mdelay(3000); /* 延时3秒 */ } } static void sensor_process_entry(void *parameter) { sensor_data_t data; os_size_t data_size; while (1) { os_mq_recv(sensor_mq, &data, sizeof(sensor_data_t), OS_IPC_WAITING_FOREVER, &data_size); printf("---------Sensor Data--------\n"); printf("temp: %.2f\n", data.temp); printf("humi: %.2f\n", data.humi); printf("light: %.2f\n", data.light); printf("ps: %d\n", data.ps); printf("----------------------------\n"); } } int main(void) { printf("Hello, OneOS!\n"); sensor_init(); sensor_mq = os_mq_create("sensor_mq", sizeof(sensor_data_t), 10, OS_IPC_FLAG_PRIO); OS_ASSERT(sensor_mq != OS_NULL); /* 创建传感器读取任务 */ os_task_t *sensor_read_task = os_task_create("sensor_read", sensor_read_entry, OS_NULL, 1024, 20, 5); OS_ASSERT(sensor_read_task != OS_NULL); os_task_startup(sensor_read_task); /* 创建传感器处理任务 */ os_task_t *sensor_process_task = os_task_create("sensor_process", sensor_process_entry, OS_NULL, 2048, 15, 5); OS_ASSERT(sensor_process_task != OS_NULL); os_task_startup(sensor_process_task); return 0; } 关于OneOS消息队列及任务间数据通信的详细内容可以访问 消息队列 进行学习。 通过MQTT接入OneNET Studio MQTT组件 OneOS操作系统通过移植Paho-MQTT软件包来实现MQTT协议功能,开发者可以通过OneOS Cube中的menuconfig图形化界面轻松的将MQTT组件集成到自己的应用中,MQTT组件的配置如下: (Top) → Components→ Network→ Protocols→ MQTT Enable Paho MQTT Enable Paho MQTT TLS encrypt Enable Paho MQTT sample 关于MQTT组件的配置及API说明可以访问 MQTT用户编程手册 进行学习。 cJSON组件 OneNET Studio使用 OneJSON 作为物模型通信协议,OneJSON协议是针对物联网开发领域设计的一种数据交换规范,数据格式是JSON,用于设备端和物联网平台的双向通信,更便捷地实现和规范了设备端和物联网平台之间的业务数据交互。 OneOS操作系统通过cJSON组件提供JSON格式数据创建和解析的能力,cJSON组件的配置如下: (Top) → Thirdparty→ cJSON cJSON: Ultralightweight JSON parser in ANSI C 关于cJSON的详细说明可以访问 cJSON 进行学习。 Molink组件 OneOS操作系统通过 Molink模组互联套件 来提供设备与平台间互联互通的能力。Molink通过架构设计和模组适配实现了对不同的通信模组的统一控制,并向上层框架和应用提供统一的API接口,使开发者不必关心不同模组之间的差异即可完成网络相关应用的开发。 本文以使用 ML302 为例,ML302 是中国移动最新推出的 LTE Cat.1 模块。ML302 支持 TD- LTE/FDD- LTE 通信制式,采用 LCC+LGA 封装方式。丰富的 Internet 协议、行业标准接口和功能,支持 Windows、Linux 和 Android 驱动。ML302 可广泛应用到 M2M多个领域中,如共享、金融支付、POC、工业控制等。 Molink中ML302的配置如下所示: (Top) → Components → Network → Molink → Enable IoT modules support → Modules → 4G CAT1 Modules Support → ML302 → ML302 Enable ML302 Module Object Auto Create (uart4) ML302 Interface Device Name (115200) ML302 Interface Device Rate (512) The maximum length of AT command data accepted -*- Enable ML302 Module General Operates -*- Enable ML302 Module Network Service Operates Enable ML302 Module Ping Operates Enable ML302 Module Ifconfig Operates -*- Enable ML302 Module Network TCP/IP Operates Enable ML302 Module BSD Socket Operates Enable ML302 Module MQTT Client Operates 如果需要使用其他的通信模组,只需在Molink的菜单下进行重新配置即可,关于Molink的配置及API说明可以访问 Molink用户编程手册 进行学习。 完成上述MQTT、cJSON及Molink组件的配置后,在OneOS-Cube工具中使用命令scons --ide=mdk5更新MDK工程设置 MQTT、cJSON及Molink相关的代码将会被加入到MDK工程中, 编译代码并下载至万耦开发板中,当看到如下的日志输出时,说明ML302模组初始化成功。 示例代码 编写如下所示的代码连接到OneNET Studio平台,并将传感器数据发布至平台。 #include #include #include #include #include #include #include #include static os_device_t *sensor_temp = OS_NULL; static os_device_t *sensor_humi = OS_NULL; static os_device_t *sensor_light = OS_NULL; static os_device_t *sensor_ps = OS_NULL; static os_mq_t *sensor_mq = OS_NULL; typedef struct sensor_data { double temp; double humi; double light; int ps; } sensor_data_t; static void sensor_init(void) { ...... } static void sensor_read_entry(void *parameter) { ...... } #define MQTT_SERVER_IP "218.201.45.7" #define MQTT_SERVER_PORT (1883) #define MQTT_CLINET_ID "oneos_test" #define MQTT_POST_TOPIC "$sys/9HFp6Cf7i4/oneos_test/thing/property/post" #define MQTT_COMMAND_TIMEOUT (30000) #define MQTT_CLIENT_USERNAME "用户名" #define MQTT_CLINET_PASSWORD "用户密码" static unsigned char send_buff = {0}; static unsigned char read_buff = {0}; static void sensor_process_entry(void *parameter) { sensor_data_t data; os_size_t data_size; Network network; MQTTClient client; MQTTNetworkInit(&network, MQTT_SERVER_IP, MQTT_SERVER_PORT, OS_NULL); MQTTClientInit(&client, &network, MQTT_COMMAND_TIMEOUT, send_buff, sizeof(send_buff), read_buff, sizeof(read_buff)); int rc = network.connect(&network); if (0 != rc) { printf("Establish network failed, check MQTT server ip and port"); return; } MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer; connectData.clientID.cstring = MQTT_CLINET_ID; connectData.username.cstring = MQTT_CLIENT_USERNAME; connectData.password.cstring = MQTT_CLINET_PASSWORD; if ((rc = MQTTConnect(&client, &connectData)) != 0) { printf("Return code from MQTT connect is %d", rc); return; } else { printf("MQTT Client Connected"); } while (1) { os_mq_recv(sensor_mq, &data, sizeof(sensor_data_t), OS_IPC_WAITING_FOREVER, &data_size); printf("---------Sensor Data--------\n"); /* 四舍五入保留两位小数 */ data.temp = ((int)(data.temp * 100 + 0.5)) / 100.0; data.humi = ((int)(data.humi * 100 + 0.5)) / 100.0; data.light = ((int)(data.light * 100 + 0.5)) / 100.0; printf("temp: %.2f\n", data.temp); printf("humi: %.2f\n", data.humi); printf("light: %.2f\n", data.light); printf("ps: %d\n", data.ps); printf("----------------------------\n"); if (MQTTIsConnected(&client)) { /* 将数据封装为OneJSON格式 */ cJSON *onejson_head = cJSON_CreateObject(); cJSON_AddStringToObject(onejson_head, "id", "123"); cJSON_AddStringToObject(onejson_head, "version", "1.0"); cJSON *onejson_params = cJSON_CreateObject(); cJSON *onejson_temp = cJSON_CreateObject(); cJSON_AddNumberToObject(onejson_temp, "value", data.temp); cJSON *onejson_humi = cJSON_CreateObject(); cJSON_AddNumberToObject(onejson_humi, "value", data.humi); cJSON *onejson_light = cJSON_CreateObject(); cJSON_AddNumberToObject(onejson_light, "value", data.light); cJSON *onejson_ps = cJSON_CreateObject(); cJSON_AddNumberToObject(onejson_ps, "value", data.ps); cJSON_AddItemToObject(onejson_params, "temp", onejson_temp); cJSON_AddItemToObject(onejson_params, "humi", onejson_humi); cJSON_AddItemToObject(onejson_params, "light", onejson_light); cJSON_AddItemToObject(onejson_params, "ps", onejson_ps); cJSON_AddItemToObject(onejson_head, "params", onejson_params); MQTTMessage message; message.qos = QOS1; message.retained = 0; message.payload = cJSON_Print(onejson_head); message.payloadlen = strlen(message.payload); /* 上报数据到OneOS Studio平台 */ rc = MQTTPublish(&client, MQTT_POST_TOPIC, &message); if (rc != 0) { printf("MQTT Client publish error %d\n", rc); } printf("MQTT Client publish success!\n"); free(message.payload); cJSON_Delete(onejson_head); } } } int main(void) { ...... } 其中,MQTT设备属性上报的主题为$sys/{pid}/{device-name}/thing/property/post,关于MQTT通信主题的详细内容可以访问 MQTT通信主题 进行学习。 编译代码并下载至万耦开发板中,当看到串口中输出MQTT Client publish success!时表示向OneNET Studio平台的物模型发布新的属性值成功。 打开OneNET Studio的设备详情页面,可以看到OneOS上报的AHT10温/湿度传感器和AP3216C光强/接近位置传感器的数据。 常见问题 1. 我没有ML302模组,如何使用其他模组来完成上述的示例? 本示例并不依赖与特定型号的模组,开发者可以在Molink的菜单下进行重新配置选择模组。 2. 我没有万耦开发板,如何使用其他开发板来完成上述的示例? OneOS已经适配支持了许多的开发板,可以查看projects目录下支持的开发板型号,选择一款适合自己的开发板。 3. 使用OneNET-Token计算工具计算出来的Token无法连接至平台怎么办? 请尝试调整Token中参数的顺序,如下图所示: References OneNET Studo快速入门: https://open.iot.10086.cn/doc/iot_platform/book/get-start/login.html#1 创建产品: https://open.iot.10086.cn/doc/iot_platform/book/device-connect&manager/product-create.html 设备安全认证: https://open.iot.10086.cn/doc/iot_platform/book/device-connect&manager/device-auth.html#%E8%AE%BE%E5%A4%87%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81 物模型: https://open.iot.10086.cn/doc/iot_platform/book/device-connect&manager/thing-model/introduce.html OneOS仓库: https://gitee.com/cmcc-oneos/OneOS OneOS官网: https://os.iot.10086.cn/download/ OneOS-Cube环境搭建: https://os.iot.10086.cn/doc/quick_start/setup_env/oneos_cube.html 万耦开发板开发文档: https://os.iot.10086.cn/doc/hardware_support/oneos_dev_board.html Sensor设备用户开发: https://os.iot.10086.cn/doc/user_guide/driver/sensor.html 任务管理及调度: https://os.iot.10086.cn/doc/api_refer/kernel/task.html 消息队列: https://os.iot.10086.cn/doc/api_refer/kernel/mq.html MQTT用户编程手册: https://os.iot.10086.cn/doc/user_guide/components/ug_pahomqtt.html cJSON: https://github.com/DaveGamble/cJSON Molink用户编程手册: https://os.iot.10086.cn/doc/user_guide/components/ug_molink_v1.1.0.html MQTT通信主题: https://open.iot.10086.cn/doc/iot_platform/book/device-connect&manager/MQTT/topic.html#2 作者: 柏灵 中移OneOS
相关资源
  • 所需E币: 5
    时间: 2021-8-10 18:36
    大小: 5.4MB
    上传者: Rain管理
    经过最近几年的积累,中国移动已经形成了以物联网中台为核心的“云-管-边-端”的布局。在端侧能提供芯片、通讯模组、行业终端以及实时操作系统;网络侧不仅支持4G、5G等蜂窝接入能力,也有蓝牙、WiFi等专项能力;在云侧则具备打造三大云平台的能力。OneOS系统,是一款遵循MISRAC设计的实时操作系统。据悉,该系统具有分层架构,由内核、驱动和组件形成的,具备极高的安全性和伸缩性,用户能够根据行业特点、应用需求,来裁减和灵活的配置。OneOS系统支持跨芯片平台、互联互通、端云融合,能很好的满足万物互联时代应用的需求。