Написал патч для bluez. Используя встроенный плагин autopair при условии что используется capability=noinputnooutput пин-код для паринга устройств берем из файла main.conf
При компиляции получаю предупреждение:
plugins/autopair.c:158:18: предупреждение: при передаче аргумента 2 «memcpy» целое преобразуется в указатель без приведения типа [-Wint-conversion]
   memcpy(pinbuf, main_opts.defaultpin, 4);
                  ^~~~~~~~~
замечание: ожидался тип «const void * restrict», но аргумент имеет тип «gchar {aka char}»
 extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
              ^~~~~~
# cat ./bluez.patch 
--- ./main.c_old	2018-06-01 16:37:36.000000000 +0800
+++ ./src/main.c	2018-11-28 13:56:32.489196607 +0800
@@ -90,6 +90,7 @@
 	"MultiProfile",
 	"FastConnectable",
 	"Privacy",
+	"DefaultPin",
 	NULL
 };
 
@@ -317,6 +318,16 @@
 		g_free(str);
 	}
 
+	val = g_key_file_get_string(config, "General",
+						"DefaultPin", &err);
+	if (err) {
+		DBG("%s", err->message);
+		g_clear_error(&err);
+	} else {
+		DBG("defaultpin=%d", val);
+		main_opts.defaultpin = val;
+	}
+
 	str = g_key_file_get_string(config, "General", "Name", &err);
 	if (err) {
 		DBG("%s", err->message);
@@ -434,6 +445,7 @@
 	main_opts.reverse_sdp = TRUE;
 	main_opts.name_resolv = TRUE;
 	main_opts.debug_keys = FALSE;
+	main_opts.defaultpin = 0000;
 
 	if (sscanf(VERSION, "%hhu.%hhu", &major, &minor) != 2)
 		return;
--- ./hcid.h_old	2018-06-01 16:37:36.000000000 +0800
+++ ./src/hcid.h	2018-11-28 13:54:29.753199017 +0800
@@ -41,6 +41,7 @@
 	uint32_t	pairto;
 	uint32_t	discovto;
 	uint8_t		privacy;
+	char		defaultpin;
 
 	gboolean	reverse_sdp;
 	gboolean	name_resolv;
--- ./autopair.c_old	2018-11-30 14:32:55.000000000 +0800
+++ ./plugins/autopair.c	2018-12-05 10:10:59.000000000 +0800
@@ -35,12 +35,14 @@
 
 #include "src/plugin.h"
 #include "src/adapter.h"
 #include "src/device.h"
 #include "src/log.h"
 #include "src/storage.h"
+#include "src/agent.h"
 
 /*
  * Plugin to handle automatic pairing of devices with reduced user
@@ -62,6 +64,8 @@
 	char pinstr[7];
 	char name[25];
 	uint32_t class;
+	uint8_t io_cap;
+	struct agent *agent;
 
 	ba2str(device_get_address(device), addr);
 
@@ -143,7 +147,18 @@
 		}
 		break;
 	}
-
+	/*check capability=NOINPUTNOOUTPUT and use DefaultPin=0000 or from main.conf if available*/
+	if (agent)
+	    io_cap = agent_get_io_capability(agent);
+	
+	if (io_cap == 0x03) {
+	    DBG("capability set to NOINPUTNOOUTPUT use defaultpin");
+		if (attempt > 1)
+			return 0;
+		memcpy(pinbuf, main_opts.defaultpin, 4);
+		return 4;
+	}
+	
 	return 0;
 }

