Linux 智能模组产品概览
OpenLinux 平台
移远 Linux 智能模组基于 OpenLinux 平台,提供完整的 Linux 开发环境,支持 C/C++、Python、Node.js 等多种开发语言。
与 Android 模组的区别
| 特性 | Linux 智能模组 | Android 智能模组 |
|---|---|---|
| 操作系统 | OpenLinux(基于 Yocto) | Android 11 |
| 启动时间 | 快(< 10s) | 慢(30-60s) |
| 内存占用 | 低(< 100MB) | 高(> 500MB) |
| 开发语言 | C/C++/Python/Shell | Java/Kotlin/C++ |
| 适用场景 | 工业网关、路由器 | POS 机、工业平板 |
| 功耗 | 低 | 高 |
主力产品
EC200A-CN(Cat.1 Linux)
| 参数 | 规格 |
|---|---|
| 蜂窝 | LTE Cat.1 |
| 处理器 | 联发科 MT6833(ARM Cortex-A55) |
| RAM | 256MB DDR3 |
| Flash | 512MB NAND |
| OS | OpenLinux(Linux 4.x) |
| 接口 | USB / UART / SPI / I2C / GPIO / ADC |
| 工作温度 | -35°C ~ +75°C |
RG500Q(5G Linux)
| 参数 | 规格 |
|---|---|
| 蜂窝 | 5G NR Sub-6G |
| 处理器 | 高通 SDX55(ARM Cortex-A7) |
| RAM | 512MB LPDDR4 |
| Flash | 2GB eMMC |
| OS | OpenLinux(Linux 5.x) |
| 接口 | USB 3.1 / PCIe / UART / GPIO |
开发环境
交叉编译工具链
bash
# 下载移远提供的 SDK(包含工具链)
# 解压后设置环境变量
# 设置交叉编译工具链
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
# 或使用 SDK 提供的环境脚本
source /opt/quectel-sdk/environment-setup-armv7ahf-neon-poky-linux-gnueabi
# 验证工具链
arm-linux-gnueabihf-gcc --version
# arm-linux-gnueabihf-gcc (GCC) 9.3.0编译 Hello World
c
// hello.c
#include <stdio.h>
int main() {
printf("Hello from Quectel Linux Module!\n");
return 0;
}bash
# 交叉编译
arm-linux-gnueabihf-gcc -o hello hello.c
# 上传到模组
adb push hello /tmp/
adb shell chmod +x /tmp/hello
adb shell /tmp/hello
# 输出:Hello from Quectel Linux Module!网络编程
TCP 服务器
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int main() {
int server_fd, client_fd;
struct sockaddr_in address;
char buffer[BUFFER_SIZE];
// 创建 socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);
// 绑定端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
// 监听
listen(server_fd, 5);
printf("Server listening on port %d\n", PORT);
while (1) {
// 接受连接
socklen_t addrlen = sizeof(address);
client_fd = accept(server_fd, (struct sockaddr *)&address, &addrlen);
printf("Client connected: %s\n", inet_ntoa(address.sin_addr));
// 读取数据
int bytes = read(client_fd, buffer, BUFFER_SIZE);
buffer[bytes] = '\0';
printf("Received: %s\n", buffer);
// 发送响应
const char *response = "HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK";
send(client_fd, response, strlen(response), 0);
close(client_fd);
}
return 0;
}MQTT 客户端(使用 Paho)
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS "tcp://broker.emqx.io:1883"
#define CLIENTID "QuectelLinuxClient"
#define TOPIC "sensor/data"
#define QOS 1
#define TIMEOUT 10000L
int main() {
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
int rc = MQTTClient_connect(client, &conn_opts);
if (rc != MQTTCLIENT_SUCCESS) {
printf("Failed to connect, return code %d\n", rc);
return -1;
}
// 发布消息
const char *payload = "{\"temperature\":25.6,\"humidity\":60}";
pubmsg.payload = (void *)payload;
pubmsg.payloadlen = strlen(payload);
pubmsg.qos = QOS;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
MQTTClient_waitForCompletion(client, token, TIMEOUT);
printf("Message published\n");
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
return 0;
}Python 开发
Linux 模组支持 Python 3,适合快速开发:
python
#!/usr/bin/env python3
# 工业数据采集脚本
import serial
import json
import time
import paho.mqtt.client as mqtt
# 配置
SERIAL_PORT = "/dev/ttyUSB0"
BAUD_RATE = 9600
MQTT_BROKER = "broker.emqx.io"
MQTT_TOPIC = "factory/sensor/data"
def read_modbus_data():
"""读取 Modbus RTU 数据"""
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
# Modbus 读保持寄存器请求
# 从站地址=1, 功能码=0x03, 起始地址=0x0000, 数量=2
request = bytes([0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B])
ser.write(request)
response = ser.read(9) # 期望 9 字节响应
ser.close()
if len(response) == 9:
# 解析温度和湿度(假设各占一个寄存器)
temperature = (response[3] << 8 | response[4]) / 10.0
humidity = (response[5] << 8 | response[6]) / 10.0
return {"temperature": temperature, "humidity": humidity}
return None
def main():
# 连接 MQTT
client = mqtt.Client()
client.connect(MQTT_BROKER, 1883, 60)
client.loop_start()
while True:
data = read_modbus_data()
if data:
payload = json.dumps(data)
client.publish(MQTT_TOPIC, payload)
print(f"Published: {payload}")
time.sleep(5)
if __name__ == "__main__":
main()系统管理
开机自启动(systemd)
ini
# /etc/systemd/system/myapp.service
[Unit]
Description=My IoT Application
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetbash
# 启用服务
systemctl enable myapp.service
systemctl start myapp.service
# 查看状态
systemctl status myapp.service
# 查看日志
journalctl -u myapp.service -fOTA 固件升级
bash
# 移远提供 OTA 升级工具
# 通过 HTTP 下载固件包并升级
#!/bin/bash
FIRMWARE_URL="https://ota.example.com/firmware/latest.tar.gz"
FIRMWARE_FILE="/tmp/firmware.tar.gz"
# 下载固件
wget -O $FIRMWARE_FILE $FIRMWARE_URL
# 验证 MD5
EXPECTED_MD5="abc123..."
ACTUAL_MD5=$(md5sum $FIRMWARE_FILE | cut -d' ' -f1)
if [ "$EXPECTED_MD5" = "$ACTUAL_MD5" ]; then
echo "固件验证通过,开始升级..."
# 执行升级脚本
tar -xzf $FIRMWARE_FILE -C /tmp/
/tmp/upgrade.sh
else
echo "固件验证失败,取消升级"
fi