From ff970152123acde6084e9de1b3bad134922fc9c2 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Thu, 20 Nov 2025 15:19:48 +0800
Subject: [PATCH] updte iotd to support deb package
---
project/4.mqttd/etc/iotd.conf | 2
.gitignore | 4 +
project/4.mqttd/deb/build.sh | 128 ++++++++++++++++++++++++++++++++++++++++++
project/4.mqttd/iotd.c | 8 +-
project/4.mqttd/makefile | 13 +++-
project/4.mqttd/deb/makefile | 16 +++++
6 files changed, 163 insertions(+), 8 deletions(-)
diff --git a/.gitignore b/.gitignore
index b6cae91..ea08dae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,10 @@
cscope.*
tags
+# deb package
+project/4.mqttd/deb/*d
+*.deb
+
# running files
*.log
*.db
diff --git a/project/4.mqttd/deb/build.sh b/project/4.mqttd/deb/build.sh
new file mode 100755
index 0000000..03bc13e
--- /dev/null
+++ b/project/4.mqttd/deb/build.sh
@@ -0,0 +1,128 @@
+#!/bin/bash
+
+set -e
+
+PRJ_PATH=$(cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
+APP_NAME=$(basename "${PRJ_PATH}")
+VERSION=1.0
+ARCH=armhf
+
+do_export() {
+ echo $PRJ_PATH
+
+ OUTPUT_DEB="${APP_NAME}.deb"
+ BUILD_DIR="${APP_NAME}"
+
+ BINARY_PATH="${PRJ_PATH}/${APP_NAME}"
+ CONF_PATH="${PRJ_PATH}/etc/${APP_NAME}.conf"
+ SERVICE_PATH="${PRJ_PATH}/etc/${APP_NAME}.service"
+ DEBIAN_DIR="${BUILD_DIR}/DEBIAN"
+}
+
+# Clean all build artifacts
+do_clean() {
+ rm -rf ${BUILD_DIR} ${OUTPUT_DEB}
+}
+
+do_fetch() {
+ # Validate required input files
+ if [ ! -f ${BINARY_PATH} ]; then
+ echo "ERROR: Binary not found at ${BINARY_PATH}" >&2
+ exit 1
+ fi
+ if [ ! -f ${CONF_PATH} ]; then
+ echo "ERROR: Config file not found at ${CONF_PATH}" >&2
+ exit 1
+ fi
+ if [ ! -f ${SERVICE_PATH} ]; then
+ echo "ERROR: Service file not found at ${SERVICE_PATH}" >&2
+ exit 1
+ fi
+
+ # ensure clean state before fetch
+ do_clean
+
+ mkdir -p ${DEBIAN_DIR}
+ install -D -m 755 ${BINARY_PATH} ${BUILD_DIR}/usr/bin/${APP_NAME}
+ install -D -m 644 ${CONF_PATH} ${BUILD_DIR}/etc/${APP_NAME}.conf
+ install -D -m 644 ${SERVICE_PATH} ${BUILD_DIR}/lib/systemd/system/${APP_NAME}.service
+}
+
+do_conf() {
+ cat > ${DEBIAN_DIR}/control <<EOF
+Package: ${APP_NAME}
+Version: ${VERSION}
+Section: utils
+Priority: optional
+Architecture: ${ARCH}
+Maintainer: Guowenxue <guowenxue@gmail.com>
+Description: Custom ${APP_NAME} daemon for Raspberry Pi
+ This package provides the ${APP_NAME} service.
+Depends: systemd
+EOF
+
+ cat > ${DEBIAN_DIR}/postinst <<EOF
+#!/bin/sh
+set -e
+if [ "\$1" = "configure" ]; then
+ systemctl daemon-reload
+ systemctl enable --now ${APP_NAME}.service
+fi
+EOF
+ chmod +x ${DEBIAN_DIR}/postinst
+
+ cat > ${DEBIAN_DIR}/prerm <<EOF
+#!/bin/sh
+set -e
+if [ "\$1" = "remove" ]; then
+ systemctl stop ${APP_NAME}.service || true
+ systemctl disable ${APP_NAME}.service || true
+fi
+EOF
+ chmod +x ${DEBIAN_DIR}/prerm
+
+ echo /etc/${APP_NAME}.conf > ${DEBIAN_DIR}/conffiles
+}
+
+do_build() {
+ dpkg-deb --build ${BUILD_DIR} ${OUTPUT_DEB}
+}
+
+# Parse command-line options
+do_args() {
+ local clean_only=0
+
+ while getopts "c" opt; do
+ case $opt in
+ c)
+ clean_only=1
+ ;;
+ \?)
+ echo "Usage: $0 [-c] [APP_NAME]" >&2
+ exit 1
+ ;;
+ esac
+ done
+
+ shift $((OPTIND - 1))
+ if [ $# -gt 0 ]; then
+ APP_NAME="$1"
+ PRJ_APP=$PRJ_PATH/${APP_NAME}
+ fi
+
+ do_export
+
+ if [ "$clean_only" = "1" ]; then
+ do_clean
+ exit
+ fi;
+}
+
+main() {
+ do_args "$@"
+ do_fetch
+ do_conf
+ do_build
+}
+
+main "$@"
diff --git a/project/4.mqttd/deb/makefile b/project/4.mqttd/deb/makefile
new file mode 100644
index 0000000..a4822be
--- /dev/null
+++ b/project/4.mqttd/deb/makefile
@@ -0,0 +1,16 @@
+
+APP_NAME?=iotd
+
+PRJ_PATH=$(shell pwd)
+
+DEB_FILES := $(wildcard *.deb)
+DEB_DIRS := $(patsubst %.deb,%,$(DEB_FILES))
+
+all:
+ @./build.sh ${APP_NAME}
+
+clean:
+ @./build.sh -c ${APP_NAME}
+
+distclean: clean
+ @rm -rf ${DEB_FILES} ${DEB_DIRS}
diff --git a/project/4.mqttd/etc/iotd.conf b/project/4.mqttd/etc/iotd.conf
index a32c09f..0b4d3ba 100644
--- a/project/4.mqttd/etc/iotd.conf
+++ b/project/4.mqttd/etc/iotd.conf
@@ -47,7 +47,7 @@
[publisher]
-# mosquitto_sub -h weike-iot.com -p 8013 -u lingyun -P lingyun -t \$Sys/Studio/Uplink/rpi001
+# mosquitto_pub -h weike-iot.com -p 8013 -u lingyun -P lingyun -t \$Sys/Studio/Uplink/rpi001 -m '{"temperature":66.66, "humidity":88.8}'
pubTopic="$Sys/Studio/Uplink"
pubQos=0
diff --git a/project/4.mqttd/iotd.c b/project/4.mqttd/iotd.c
index d56f9a5..1db2f2d 100644
--- a/project/4.mqttd/iotd.c
+++ b/project/4.mqttd/iotd.c
@@ -230,9 +230,9 @@
if( !item )
continue;
- if( strcasecmp(item->valuestring, "on") )
+ if( !strcasecmp(item->valuestring, "on") )
turn_relay(which, ON);
- else if( strcasecmp(item->valuestring, "off") )
+ else if( !strcasecmp(item->valuestring, "off") )
turn_relay(which, OFF);
}
}
@@ -246,9 +246,9 @@
if( !item )
continue;
- if( strcasecmp(item->valuestring, "on") )
+ if( !strcasecmp(item->valuestring, "on") )
turn_led(which, ON);
- else if( strcasecmp(item->valuestring, "off") )
+ else if( !strcasecmp(item->valuestring, "off") )
turn_led(which, OFF);
}
}
diff --git a/project/4.mqttd/makefile b/project/4.mqttd/makefile
index 6b13ffc..7ba434c 100644
--- a/project/4.mqttd/makefile
+++ b/project/4.mqttd/makefile
@@ -12,7 +12,9 @@
#*******************************************************************************
PRJ_PATH=$(shell pwd)
-APP_NAME = iotd
+APP_NAME=iotd
+DEB_NAME=${APP_NAME}.deb
+DEB_PATH=${PRJ_PATH}/deb
BUILD_ARCH=$(shell uname -m)
ifneq ($(findstring $(BUILD_ARCH), "x86_64" "i386"),)
@@ -39,12 +41,13 @@
# libraries
libs=openlibs ${SRCS}
-LDFLAGS+=-lmosquitto -lcjson -lssl -lcrypto -lgpiod
+LDFLAGS+=-lmosquitto -lcjson -lssl -lcrypto -lgpiod -lm
LDFLAGS+=-lpthread
all: entry subdir
${CROSS_COMPILE}gcc ${CFLAGS} ${SRCFILES} -o ${APP_NAME} ${LDFLAGS}
+ @make gendeb
entry:
@echo "Building ${APP_NAME} on ${BUILD_ARCH}"
@@ -52,11 +55,15 @@
subdir:
@for dir in ${libs} ; do CFLAGS="${CFLAGS}" make -C $${dir} ; done
+gendeb:
+ @make -C ${DEB_PATH} APP_NAME=${APP_NAME}
+
install:
- cp ${APP_NAME} /tftp
+ cp ${APP_NAME} ${DEB_PATH}/${DEB_NAME} /tftp
clean:
@for dir in ${SRCS} ; do if [ -e $${dir} ] ; then make clean -C $${dir}; fi; done
+ @make clean -C ${DEB_PATH} APP_NAME=${APP_NAME}
@rm -f ${APP_NAME}
distclean:
--
Gitblit v1.9.1