基于阿里云 Haas510 制作数据转发服务

简介: 通过Haas-510制作Lora 无线发射器,只有 Javascript 的开发背景,是否可以完成这项任务呢?答案是肯定的!接下来内容将说明如何使用 Haas-510 ,完成数据转发的过程;本篇内容需要简单的 终端、Nodejs 知识,代码量很少,前端程序员、nodejs 程序员很容易上手。

如题,公司需求一个 Lora 无线发射器,通过串口发送数据,只有 Javascript 的开发背景,是否可以完成这项任务呢?答案是肯定的!接下来内容将说明如何使用 Haas510,完成 4G 数据接收,Uart 串口转发的过程;

  • 原理图:确定技术线路,明确思路
  • 准备工作:准备物料、必要的软件工具
  • 单元测试:拆解不同功能、步骤,一一实现
  • 合并代码:合并单元测试环节代码
  • 参考资料:Haas SDK、相关资源

1、原理图

「呼叫 api」->「mqtt server」-> 「haas mqtt client」-> 「haas uart」-> 「lora 发射模组」

原理图-美特互动大力

负责硬件的同事已完成 lora 模组,本篇仅介绍 Haas510 的使用;

2、准备工作

配合物料、调试工具、以及一些软件框架。JS 程序员对硬件一般比较陌生,好在难度并不大,都是使用现成的配件连接调试;

2.1、物料配置

Haas510 已经附赠了基本配件,仅需要添置一些必要的连接线就可以进行单元测试,以下是物料清单;

[ 物料准备图示 ]

物料准备-美特互动大力

[ 物料清单 ]

物料 说明
Haas510 AS 数据转发核心板
USB 转 TTL 将杜邦线连接到MacOS的工具,并生成设备标志
杜邦线 每个连接用到 3 根并联的线材 ,建议长度规格 > 30CM
MiniUSB 数据线 开发期间供电 ,充电头规格 5V2A,保证线材良好
Nano 卡 一般手机内使用的 SIM 卡就对了

为了连接多个USB,还需要 USB 一拖多 小工具

2.2、连接物料

下图标出 ①②③④⑤⑥ 位置,物料按序号进行连接;

连接物料示意图-美特互动大力

[ 三组数据线说明 ]

分组 说明
用于主板宿主平台的调试输出,以及JS代码的console.log输出
将 JS 编写的代码,从 Mac 传送到 Haas510 主板
serial.write 数据输出,单元测试期间,通过 comtool 终端 观察数据

连接的位置已经用红色位置信息标注;

[ 杜邦线连接线序 ]

一般 USB2TTL 与 Haas510 的 TXD、RXD 需要反接,少部分例外,具体请咨询 【USB 转 TTL】 供应商

2.3、准备软件工具

本人的常用操作系统是 Mac, windows 系统请参考操作;

[ amp 下载 ]

Haas 命令行工具,将编写的 JS 代码上传到 Haas510

MacOS 版本
Windows 版本

[ comtool 安装 ]

Mac上运行的串口终端,用于 的数据调试

brew install --cask comtool
通过 Terminal 输入 open -n /Applications/comtool.app 可以多开

[ mqtt server ]

mosquitto 提供的免费服务器

项目 内容
服务器 test.mosquitto.org
通信类型 TCP
端口 1883
账号密码 任意
客户端 ID 任意

3、单元测试

这里将任务进行分解,每个单元单独完成,最后合并起来就可以了,还是上任务表吧:

单元 内容
端口确认 确定USB在Mac中的设备名称
代码调试 演示如何在桌面端通过串口工具打印信息
amp 讲解 amp 基本使用,以及演示如何通过 amp 将代码写入 Haas510
数据监听 与 mqtt 服务器通信,并获取主题消息
串口输出 Haas510 如何通过串口输出数据

3.1、端口确认

现在开始验证 ③ ④ ⑤ 是否正确接入, 使用 ls 指令及简单的拔插来确认设备名称;

ls -1 /dev/cu.wch*

目前我的配置是:

编号 用途 设备名称
代码调试 /dev/cu.wchusbserial14410
写入代码 /dev/cu.wchusbserial14420
串口输出 /dev/cu.wchusbserial14430
USB 需要 WCH 驱动支持,链接在文章最后
Windows 系统打开设备管理器,可以看到 COM1、COM2 这样设备

3.2、代码调试

启动 comtool 工具,Port 选择 /dev/cu.wchusbserial14410, Baudrate 选择 115200,其他默认;

按一次 Haas510 上的 RESET 按键,接收区滚动起来,就代表调试状态 OK 了;

comtool-DEBUG界面-美特互动大力

以下内容这个窗口称为 DEBUG 窗口

3.3、amp 使用

[ 基本配置 ]

2.3章节 下载好压缩包解压,进入目录可以看到:

├── README.md         说明
├── amp               执行文件
├── app               开发目录
│   ├── app.js
│   └── app.json
└── bindings.node     驱动文件

amp 修改为可执行文件

chmod +x amp

打印帮助

./amp help
Usage: amp [options]

AliOS Things Mini Program PC CLI tool

Options:
  -V, --version                             output the version number
  -h, --help                                output usage information

Commands:
  login|ln <token>                          login
  devicelist|dl                             list bind devices
  put|pt <filepath> <deviceName>            upload file to device
  pack|pk [options] <filepath>              pack file
  seriallist|sl                             list serial port
  serialput|sp [options] <filepath> <port>  put file to device via serial port

Example call:
  $ amp pt ./app 3JvyRjXOoQLQUYzGzAy0 -b 9600

[ 编辑 app.js ]

修改 app/app.js, 新版的 Haas510 内置了 quickjs,支持 ES6 规范,可以直接使用箭头函数等新的语法

console.log('amp version is: ' + system.version())
console.log('amp platform is: ' + system.platform())
console.log('amp heapTotal is: ' + system.memory().heapTotal)
console.log('amp heapUsed is: ' + system.memory().heapUsed)

// 写个定时器
let i = 0
setInterval(() => {
  console.log('i is ', ++i)
}, 2000)

准备在控制台上传

./amp serialput ./app /dev/cu.wchusbserial14420

回车后提示 reboot 时,按一次 Haas510 上的 RESET 按钮

generating app package...
Wait shakehand with board ...
Please reboot board now
Putting: ██████████████████████████████ 2/2
put complete!
  • 如果 接入正常,会看到一个上传进度
  • 同时可在调试窗口观察到系统加载的数据瀑布流,最后执行 app.js 代码

3.4、数据监听

本项目数据转发有实时性的要求, MQTT 是最佳选择;
Haas510 已经内置这个模块,支持两种连接方式:

这里选择第 2 种方案,确认已经安装好 SIM 卡及天线;

[ 编辑 app.js ]

import * as network from 'network'
import * as mqtt from 'mqtt'

const topic = '/haas510/as'
const config = {
  host: 'test.mosquitto.org',
  port: 1883,
  username: '',
  password: ''
}
// 这个函数只用于 console.log 打印,实际转发串口数据是不需要的
function ArrayToString(fileData) {
  let dataString = ''
  for (let i = 0; i < fileData.length; i++) {
    dataString += String.fromCharCode(fileData[i])
  }
  return dataString
}
function createMqttClient() {
  const mqttClient = mqtt.createClient(config)
  mqttClient.on('connect', () => {
    console.log('----------------------------: connect')
    // 此时进行订阅设置
    mqttClient.subscribe({ topic })
  })
  mqttClient.on('disconnect', () => {
    console.log('----------------------------: disconnect')
  })
  mqttClient.on('message', (topic, payload) => {
    // 监听消息并打印,payload 是 Array[Number]
    let content = ArrayToString(payload)
    console.log('----------------------------: mqtt message')
    console.log('[' + topic + ']  message: ' + content)
  })
}

const net = network.openNetWorkClient()
net.on('connect', () => createMqttClient())

[ 消息测试 ]

编写一个简单的 mqtt 客户端来发送测试消息,新建目录并安装依赖;本地需要有 nodejs 环境;

# 建立文件夹
mkdir -p /path/to/mqttclient && cd /path/to/mqttclient
# npm 初始化及依赖
npm init -y && npm install mqtt
# 创建 index.js
touch index.js

将代码贴入 index.js

const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://test.mosquitto.org:1883')
const topic = '/haas510/as'
client.on('connect', () => {
  client.publish(topic, 'Hello Haas510')
  client.end()
})

然后执行 node index.js,在 DEBUG 窗口 可观察到打印 Hello Haas510

3.5、串口输出

本单元测试的时候直接输出到 Mac,通过观察串口工具显示,直观了解数据是否符合预期需求

[ 串口工具配置 ]

启动串口工具 comtool,这里速率根据 Lora 模组要求来设定的

  • 端口选择 /dev/cu.wchusbserial14430
  • 速率选择 9600

[ 配置 app/app.json ]

需要告诉 Haas510 连接什么类型端口、以及配置

{
  "version": "1.0.0",
  "io": {
    "UART1": {
      "type": "UART",
      "port": 1,
      "dataWidth": 8,
      "baudRate": 9600,
      "stopBits": 1,
      "flowControl": "disable",
      "parity": "none"
    }
  },
  "debugLevel": "DEBUG"
}

其中 io.UART1 就是 位置标注的 567 三个接线位

[ 编辑 app/app.js ]

import * as uart from 'uart'
const serial = uart.open({ id: 'UART1' })
setInterval(() => {
  // 输出字符串 123
  serial.write([49, 50, 51])
}, 2000)

需要注意的是:

  • id 就是 app.json 里头的 io.UART1
  • serial.write 参数是 Array[Number],其中 Number 是字符的 ASCII 码
  • mqtt 的 message 默认就是 Array[Number],无需做转换

执行上传

./amp serialput ./app /dev/cu.wchusbserial14420

Haas510 启动完毕后,就可以在 comtool 工具上看到字符串被定时打印;

comtool-UART界面-美特互动大力

4、合并代码

import * as network from 'network'
import * as mqtt from 'mqtt'
import * as uart from 'uart'

const serial = uart.open({ id: 'UART1' })

const createMqttClient = () => {
  const mqttClient = mqtt.createClient({
    host: 'test.mosquitto.org',
    port: 1883,
    username: '',
    password: ''
  })
  mqttClient.on('connect', () => {
    mqttClient.subscribe({ topic: '/haas510/as' })
  })
  mqttClient.on('disconnect', () => {
    system.reboot()
  })
  mqttClient.on('message', (_, payload) => {
    if (payload.length) {
      serial.write(payload)
    }
  })
}

const net = network.openNetWorkClient()
net.on('connect', () => createMqttClient())

这里 system.reboot() 是 Haas510 隐藏功能,当 mqtt 断开时,重启主板;

至此,从 mqtt 监听获取数据,到串口输出的工作已经完成;

5、参考资料

[ Haas510 JS Api 参考 ]

名称 详细
uart https://iotmp.yuque.com/books/share/b4b9fa49-a30b-4e6f-b40f-3864e9a531a8/gsb9gg
network https://iotmp.yuque.com/books/share/b4b9fa49-a30b-4e6f-b40f-3864e9a531a8/komh3c
mqtt https://iotmp.yuque.com/books/share/b4b9fa49-a30b-4e6f-b40f-3864e9a531a8/ty8g2d

[ Mqtt server 自建 ]

名称 详细
aedes https://github.com/moscajs/aedes
https://awesomelists.net/1-Node.js/17-Real-time/266-mcollina-aedes
https://www.tabnine.com/code/javascript/modules/aedes
mosquitto https://mosquitto.org/
http://www.steves-internet-guide.com/mosquitto-broker/

[ 工具下载 ]

名称 链接
WCH 驱动 https://www.wch.cn/download/CH341SER_EXE.html
https://drive.google.com/drive/folders/1-MezxWgkZTLfTrMj0g-8kIdik0OIDz26
mqttbox https://chrome.google.com/webstore/detail/kaajoficamnjijhkeomgfljpicifbkaf
comtool https://github.com/Neutree/COMTool/releases
amp 工具 https://hli.aliyuncs.com/o/config/amp/3.0.0/macos/amp-macos.zip
https://hli.aliyuncs.com/o/config/amp/3.0.0/windows/amp-win.zip

6、外壳制作篇

https://developer.aliyun.com/article/1008875


期待 Haas 推出更多 JS 技术栈的产品,欢迎共同学习。

Haas510官方群、大力的钉钉和大力的微信

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
关系型数据库 MySQL 数据挖掘
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
DTS 作为阿里云核心的数据交互引擎,以其高效的实时数据流处理能力和广泛的数据源兼容性,为用户构建了一个安全可靠、可扩展、高可用的数据架构桥梁。阿里云数据库 SelectDB 通过与 DTS 联合,为用户提供了简单、实时、极速且低成本的事务数据分析方案。用户可以通过 DTS 数据传输服务,一键将自建 MySQL / RDS MySQL / PolarDB for MySQL 数据库,迁移或同步至阿里云数据库 SelectDB 的实例中,帮助企业在短时间内完成数据迁移或同步,并即时获得深度洞察。
阿里云 SelectDB 携手 DTS ,一键实现 TP 数据实时入仓
|
1月前
|
Arthas 弹性计算 运维
阿里云ECS监控服务
阿里云ECS监控服务
403 2
|
1月前
|
监控 网络协议 API
阿里云BssOpenAPI是一个基于阿里云开放API的服务
【2月更文挑战第24天】阿里云BssOpenAPI是一个基于阿里云开放API的服务
143 6
|
1月前
|
自然语言处理
阿里云百炼大模型服务--企业知识检索问答指南
阿里云百炼提供的企业知识检索问答应用可以帮助大家实现让大模型瞬间“开挂”的技能。结合上传的知识数据,大模型识别解析学习文档内容,最终给出生成式回复。我们在通义千问-Turbo/Max大模型基础上,将文件上传、读取、切片、向量化等过程都开发好预置在应用中,实现开箱即用,更能满足您的日常需求。
|
1月前
|
弹性计算 负载均衡 网络协议
这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
【2月更文挑战第20天】这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
73 1
|
1月前
|
SQL 人工智能 数据挖掘
阿里云DMS,身边的智能化数据分析助手
生成式AI颠覆了人机交互的传统范式,赋予每个人利用AI进行低门槛数据分析的能力。Data Fabric与生成式AI的强强联合,不仅能够实现敏捷数据交付,还有效降低了数据分析门槛,让人人都能数据分析成为可能!阿里云DMS作为阿里云统一的用数平台,在2021年初就开始探索使用Data Fabric理念构建逻辑数仓来加速企业数据价值的交付,2023年推出基于大模型构建的Data Copilot,降低用数门槛,近期我们将Notebook(分析窗口)、逻辑数仓(Data Fabric)、Data Copilot(生成式AI)进行有机组合,端到端的解决用数难题,给用户带来全新的分析体验。
110139 118
阿里云DMS,身边的智能化数据分析助手
|
1月前
|
弹性计算 NoSQL Redis
阿里云ECS使用docke搭建redis服务
阿里云ECS使用docke搭建redis服务
157 1
|
1月前
|
弹性计算 关系型数据库 MySQL
阿里云ECS使用docker搭建mysql服务
阿里云ECS使用docker搭建mysql服务
152 1
|
3天前
|
存储 开发工具 对象存储
Javaweb之SpringBootWeb案例之阿里云OSS服务入门的详细解析
Javaweb之SpringBootWeb案例之阿里云OSS服务入门的详细解析
11 0
|
13天前
|
网络协议 Java 物联网
阿里云服务器上搭建 MQTT服务
阿里云服务器上搭建 MQTT服务

热门文章

最新文章