Skip to content

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/ShellJava/Kotlin/C++
适用场景工业网关、路由器POS 机、工业平板
功耗

主力产品

EC200A-CN(Cat.1 Linux)

参数规格
蜂窝LTE Cat.1
处理器联发科 MT6833(ARM Cortex-A55)
RAM256MB DDR3
Flash512MB NAND
OSOpenLinux(Linux 4.x)
接口USB / UART / SPI / I2C / GPIO / ADC
工作温度-35°C ~ +75°C

RG500Q(5G Linux)

参数规格
蜂窝5G NR Sub-6G
处理器高通 SDX55(ARM Cortex-A7)
RAM512MB LPDDR4
Flash2GB eMMC
OSOpenLinux(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.target
bash
# 启用服务
systemctl enable myapp.service
systemctl start myapp.service

# 查看状态
systemctl status myapp.service

# 查看日志
journalctl -u myapp.service -f

OTA 固件升级

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

褚成志的笔记