跳到主要內容

網頁引入相機及QRCode判讀

 之前有寫過實名制及報名網站內含 QRCode 的判讀功能,使用 Intascan 及 Webrtc 的 javascript 模組。

參考資料:[day14]-使用網頁開啟相機掃描QR Code-instascan介紹+實際應用(https://ithelp.ithome.com.tw/articles/10206308


Instscan:https://github.com/schmich/instascan

Webrtc:https://github.com/webrtc/adapter

網頁



html 上半部是掃描結果訊息顯示的部份,result_icon 用 materical design icons 顯示各個圖示;scan_text 顯示掃描結東;result_text 顯示文字化結果。

下半以 video 顯示 WebRTC 從 Camera 擷取的畫面,並由 Instascan 依此資料判讀 QRCode 資訊。camera_select 作為切換 Camera 的功能。

Javascript

<script>

        let precode = '';

        let res = '';

        let audio = new Audio('audio_beep.mp3');

        let scanner = new Instascan.Scanner({

            video: document.getElementById('preview'),

            mirror: false

        });


        scanner.addListener('scan', function(content) {

            audio.play();

            document.getElementById('scan_text').innerHTML = content;

            let result_arr = content.split('-');

            let theyear='{{$param.semesteryear}}';

            let thename = 'KLART';

            if(result_arr[0] != thename){

                document.getElementById('result_icon').innerHTML = 'error';

                document.getElementById('result_text').innerHTML = '非本競賽之 QR-Code';

                precode='';

            }else{

                if(result_arr[1] != theyear){

                    document.getElementById('result_icon').innerHTML = 'error';

                    document.getElementById('result_text').innerHTML = '非本年度之 QR-Code'; 

                    precode='';

                }else{

                    $.ajax({

                        url: "{{base_url('/ajaxfunc/qrcodescan')}}/"+content,

                        success: function(data){

                            res = data.split(',');

                            if(res[0]=='ok'){

                                document.getElementById('result_icon').innerHTML = 'task_alt';

                                document.getElementById('result_text').innerHTML = res[1];

                            }else{

                                document.getElementById('result_icon').innerHTML = 'error';

                                document.getElementById('result_text').innerHTML = res[1];

                            }

                        }

                    });

                }

            }

        });


        Instascan.Camera.getCameras().then(function(cameras) {

            //取得設備的相機數目

            self.cameras = cameras;

            str = '';

            if (cameras.length > 0) {

                ///若設備相機數目大於0 則先開啟第0個相機(程式的世界是從第零個開始的)

                scanner.start(cameras[0]);

                for (i = 0; i < cameras.length; i++) {

                    str += '<button type="button" class="btn btn-primary btn-sm mx-1 mb-2" onclick="scanner.start(cameras[' + i + ']);"><i class="material-icons">videocam</i>' + (i+1) + '</botton>';

                }

                document.getElementById('camera_select').innerHTML = str;

            } else {

                //若設備沒有相機數量則顯示"No cameras found";

                //這裡自行判斷要寫什麼

                document.getElementById('result_icon').innerHTML = 'error';

                document.getElementById('scan_text').innerHTML = '無相機可供使用';

            }

        }).catch(function(e) {

            document.getElementById('result_icon').innerHTML = 'error';

            document.getElementById('result_text').innerHTML = e;

        });


        function cleardata() {

            document.getElementById('result_icon').innerHTML = 'loop';

            document.getElementById('scan_text').innerHTML = '';

            document.getElementById('result_text').innerHTML = '';

        }

    </script>



留言

這個網誌中的熱門文章

Arudino 教學(三):多顆 LEDs

本次實作將加深 LED 電路,練習多顆 LEDs 與共地線電路,並使用 Arduino Uno 進行控制。另外, 本次實作每個同學需要抄寫「實作目的」、「線路說明」、「程式說明」與「進階」作為實作報告。 實作目的: 熟悉多顆 LEDs 與共地線電路接線 使用 Arduino 程式進行多顆 LEDs 控制 電路圖: 線路說明: LEDs 負極(短腳)共同連接在一起,再接至 Arduino GND(接地)腳位 LEDs 正極(長腳)先連接一220Ω 電阻之後,再分別連接至 Arduino 10 號與 11號腳位 程式截圖: 程式說明: 在 setup 區塊中,利用 pinMode 設定 10 腳位為輸出用途,設定 11 腳位為輸出用途 在 loop 區域中,利用 digitalWrite 送出 HIGH 點亮  LED,LOW 關閉 LED 燈,其中 10 號腳位 HIGH 時,11號腳位則為 LOW,反之亦然 delay(1000) 延遲一秒 進階: 改變延遲時間 增加閃動變化 增加 LED 的數量

IPv6 系列(五):KEA DHCP SERVER

學校在純 IPv4 的環境時,採用 ISC-DHCP Server 來發放教學區域的私有 IP(10.10.xxx.xxx),並使用閘道 Fortigate 作 NAT 連接到 Internet。 採用 IPv6 後,原本是要使用 ISC-DHCPv6 來作為 IPv6 發放,結果 ISC-DHCPv6 架不起來。不過在查詢 DHCPv6 的過程中,發現 ISC(Internet System Consortium)已開發出下一代的 DHCP Server:Kea Dhcp Server。 Kea Dhcp Server 官網: https://www.isc.org/kea/ 摘錄  https://www.itread01.com/content/1548712273.html  對 Kea DHCP Server 的介紹: Kea DHCP Server 由 Internet Systems Consortium(ISC) 開發的開源 DHCPv4/DHCPv6 伺服器。Kea DHCP Server 是一個高效能的,可擴充套件的DHCP伺服器引擎。通過hooks library可以很容易的修改和擴充套件。 Kea包含的功能元件 keactrl — kea伺服器啟動,停止,配置重置和狀態查詢元件 kea-dhcp4 — DHCPv4伺服器程式,用於響應客戶端的DHCPv4查詢。 kea-dhcp6 — DHCPv6伺服器程式,用於響應客戶端的DHCPv6查詢。 kea-dhcp-ddns — DHCP動態DNS程式.這個程式在DHCP伺服器和DNS伺服器之間扮演者調解者。它接收來自DHCP伺服器域名更新請求和傳送DNS更新訊息給DNS伺服器。也就是說DDNS捕獲使用者每次變化的IP地址,然後將其與域名相對應,這樣其他上網使用者就可以通過域名來進行交流。而最終客戶所要記憶的全部,就是記住動態域名商給予的域名即可,而不用去管他們是如何實現的。 軟體執行環境 加密庫Botan或者OpenSSL log4cplus 1.0.3+ 如果有需要mysql,需要MySQL headers and libraries。可選(postgresql、cassandra類同) 選用 Kea DHCP Server 的原因,...

PHP 輸出 UTF-8 編碼 CSV 檔案

使用 PHP 直接輸出 UTF-8 編碼的 CSV 檔案匯入 EXCEL 會變成亂碼,需要在檔頭加入 BOM 指引碼,EXCEL才會正確讀取內容。 主要是最近寫 CI4 的系統會遇到 composer phpoffice 發生錯誤,所以不能使用 phpoffice 來匯出檔案。查詢了一些資料,用 PHP 直接把資料用 CSV 格式匯出來。 程式片段             $rows = ['學期序',…];              header('Content-type: text/csv; charset=UTF-8');             header('Content-Disposition: attachment; filename=' . $this->nowparam['semestername'] . 'csv');             $output = fopen('php://output', 'w');             fwrite($output, "\xEF\xBB\xBF");             fwrite($output, '"' . implode('","', $rows) . "\"\n");             foreach($data as $tmp){                 fwrite($output, '"' . $tmp['semester'] . '",');                 …             ...