diff --git a/ANDROID_SIGNALR_GUIDE.md b/ANDROID_SIGNALR_GUIDE.md deleted file mode 100644 index 576aba02..00000000 --- a/ANDROID_SIGNALR_GUIDE.md +++ /dev/null @@ -1,624 +0,0 @@ -# راهنمای اتصال اپلیکیشن Android به SignalR برای Face Embedding - -## 1. افزودن کتابخانه SignalR به پروژه Android - -در فایل `build.gradle` (Module: app) خود، dependency زیر را اضافه کنید: - -```gradle -dependencies { - // SignalR for Android - implementation 'com.microsoft.signalr:signalr:7.0.0' - - // اگر از Kotlin استفاده می‌کنید: - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1' - - // برای JSON پردازش: - implementation 'com.google.code.gson:gson:2.10.1' -} -``` - -## 2. اضافه کردن Permission در AndroidManifest.xml - -```xml - - -``` - -## 3. کد Java/Kotlin برای اتصال به SignalR - -### نسخه Java: - -```java -import com.microsoft.signalr.HubConnection; -import com.microsoft.signalr.HubConnectionBuilder; -import com.microsoft.signalr.HubConnectionState; -import com.google.gson.JsonObject; -import android.util.Log; - -public class FaceEmbeddingSignalRClient { - private static final String TAG = "FaceEmbeddingHub"; - private HubConnection hubConnection; - private String serverUrl = "http://YOUR_SERVER_IP:PORT/trackingFaceEmbeddingHub"; // آدرس سرور خود را وارد کنید - private long workshopId; - - public FaceEmbeddingSignalRClient(long workshopId) { - this.workshopId = workshopId; - initializeSignalR(); - } - - private void initializeSignalR() { - // ایجاد اتصال SignalR - hubConnection = HubConnectionBuilder - .create(serverUrl) - .build(); - - // دریافت رویداد ایجاد Embedding - hubConnection.on("EmbeddingCreated", (data) -> { - JsonObject jsonData = (JsonObject) data; - long employeeId = jsonData.get("employeeId").getAsLong(); - String employeeFullName = jsonData.get("employeeFullName").getAsString(); - String timestamp = jsonData.get("timestamp").getAsString(); - - Log.d(TAG, "Embedding Created - Employee: " + employeeFullName + " (ID: " + employeeId + ")"); - - // اینجا می‌توانید داده‌های جدید را از سرور بگیرید یا UI را بروزرسانی کنید - onEmbeddingCreated(employeeId, employeeFullName, timestamp); - - }, JsonObject.class); - - // دریافت رویداد حذف Embedding - hubConnection.on("EmbeddingDeleted", (data) -> { - JsonObject jsonData = (JsonObject) data; - long employeeId = jsonData.get("employeeId").getAsLong(); - String timestamp = jsonData.get("timestamp").getAsString(); - - Log.d(TAG, "Embedding Deleted - Employee ID: " + employeeId); - onEmbeddingDeleted(employeeId, timestamp); - - }, JsonObject.class); - - // دریافت رویداد بهبود Embedding - hubConnection.on("EmbeddingRefined", (data) -> { - JsonObject jsonData = (JsonObject) data; - long employeeId = jsonData.get("employeeId").getAsLong(); - String timestamp = jsonData.get("timestamp").getAsString(); - - Log.d(TAG, "Embedding Refined - Employee ID: " + employeeId); - onEmbeddingRefined(employeeId, timestamp); - - }, JsonObject.class); - } - - public void connect() { - if (hubConnection.getConnectionState() == HubConnectionState.DISCONNECTED) { - hubConnection.start() - .doOnComplete(() -> { - Log.d(TAG, "Connected to SignalR Hub"); - joinWorkshopGroup(); - }) - .doOnError(error -> { - Log.e(TAG, "Error connecting to SignalR: " + error.getMessage()); - }) - .subscribe(); - } - } - - private void joinWorkshopGroup() { - // عضویت در گروه مخصوص این کارگاه - hubConnection.send("JoinWorkshopGroup", workshopId); - Log.d(TAG, "Joined workshop group: " + workshopId); - } - - public void disconnect() { - if (hubConnection.getConnectionState() == HubConnectionState.CONNECTED) { - // خروج از گروه - hubConnection.send("LeaveWorkshopGroup", workshopId); - - hubConnection.stop(); - Log.d(TAG, "Disconnected from SignalR Hub"); - } - } - - // این متدها را در Activity/Fragment خود override کنید - protected void onEmbeddingCreated(long employeeId, String employeeFullName, String timestamp) { - // اینجا UI را بروزرسانی کنید یا داده جدید را بگیرید - } - - protected void onEmbeddingDeleted(long employeeId, String timestamp) { - // اینجا UI را بروزرسانی کنید - } - - protected void onEmbeddingRefined(long employeeId, String timestamp) { - // اینجا UI را بروزرسانی کنید - } -} -``` - -### نسخه Kotlin: - -```kotlin -import com.microsoft.signalr.HubConnection -import com.microsoft.signalr.HubConnectionBuilder -import com.microsoft.signalr.HubConnectionState -import com.google.gson.JsonObject -import android.util.Log -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch - -class FaceEmbeddingSignalRClient(private val workshopId: Long) { - - companion object { - private const val TAG = "FaceEmbeddingHub" - } - - private lateinit var hubConnection: HubConnection - private val serverUrl = "http://YOUR_SERVER_IP:PORT/trackingFaceEmbeddingHub" // آدرس سرور خود را وارد کنید - - init { - initializeSignalR() - } - - private fun initializeSignalR() { - hubConnection = HubConnectionBuilder - .create(serverUrl) - .build() - - // دریافت رویداد ایجاد Embedding - hubConnection.on("EmbeddingCreated", { data: JsonObject -> - val employeeId = data.get("employeeId").asLong - val employeeFullName = data.get("employeeFullName").asString - val timestamp = data.get("timestamp").asString - - Log.d(TAG, "Embedding Created - Employee: $employeeFullName (ID: $employeeId)") - onEmbeddingCreated(employeeId, employeeFullName, timestamp) - }, JsonObject::class.java) - - // دریافت رویداد حذف Embedding - hubConnection.on("EmbeddingDeleted", { data: JsonObject -> - val employeeId = data.get("employeeId").asLong - val timestamp = data.get("timestamp").asString - - Log.d(TAG, "Embedding Deleted - Employee ID: $employeeId") - onEmbeddingDeleted(employeeId, timestamp) - }, JsonObject::class.java) - - // دریافت رویداد بهبود Embedding - hubConnection.on("EmbeddingRefined", { data: JsonObject -> - val employeeId = data.get("employeeId").asLong - val timestamp = data.get("timestamp").asString - - Log.d(TAG, "Embedding Refined - Employee ID: $employeeId") - onEmbeddingRefined(employeeId, timestamp) - }, JsonObject::class.java) - } - - fun connect() { - if (hubConnection.connectionState == HubConnectionState.DISCONNECTED) { - CoroutineScope(Dispatchers.IO).launch { - try { - hubConnection.start().blockingAwait() - Log.d(TAG, "Connected to SignalR Hub") - joinWorkshopGroup() - } catch (e: Exception) { - Log.e(TAG, "Error connecting to SignalR: ${e.message}") - } - } - } - } - - private fun joinWorkshopGroup() { - hubConnection.send("JoinWorkshopGroup", workshopId) - Log.d(TAG, "Joined workshop group: $workshopId") - } - - fun disconnect() { - if (hubConnection.connectionState == HubConnectionState.CONNECTED) { - hubConnection.send("LeaveWorkshopGroup", workshopId) - hubConnection.stop() - Log.d(TAG, "Disconnected from SignalR Hub") - } - } - - // این متدها را override کنید - open fun onEmbeddingCreated(employeeId: Long, employeeFullName: String, timestamp: String) { - // اینجا UI را بروزرسانی کنید یا داده جدید را بگیرید - } - - open fun onEmbeddingDeleted(employeeId: Long, timestamp: String) { - // اینجا UI را بروزرسانی کنید - } - - open fun onEmbeddingRefined(employeeId: Long, timestamp: String) { - // اینجا UI را بروزرسانی کنید - } -} -``` - -## 4. استفاده در Activity یا Fragment - -### مثال با Login و دریافت WorkshopId - -#### Java: -```java -public class LoginActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_login); - - Button btnLogin = findViewById(R.id.btnLogin); - btnLogin.setOnClickListener(v -> performLogin()); - } - - private void performLogin() { - // فراخوانی API لاگین - // فرض کنید response شامل workshopId است - - // مثال ساده (باید از Retrofit یا کتابخانه مشابه استفاده کنید): - // LoginResponse response = apiService.login(username, password); - // long workshopId = response.getWorkshopId(); - - long workshopId = 123; // این را از response دریافت کنید - - // ذخیره workshopId - SharedPreferences prefs = getSharedPreferences("AppPrefs", MODE_PRIVATE); - prefs.edit().putLong("workshopId", workshopId).apply(); - - // رفتن به صفحه اصلی - Intent intent = new Intent(this, MainActivity.class); - startActivity(intent); - finish(); - } -} - -public class MainActivity extends AppCompatActivity { - private FaceEmbeddingSignalRClient signalRClient; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - // دریافت workshopId از SharedPreferences - SharedPreferences prefs = getSharedPreferences("AppPrefs", MODE_PRIVATE); - long workshopId = prefs.getLong("workshopId", 0); - - if (workshopId == 0) { - // اگر workshopId وجود نداره، برگرد به صفحه لاگین - Intent intent = new Intent(this, LoginActivity.class); - startActivity(intent); - finish(); - return; - } - - // ایجاد و اتصال SignalR - signalRClient = new FaceEmbeddingSignalRClient(workshopId) { - @Override - protected void onEmbeddingCreated(long employeeId, String employeeFullName, String timestamp) { - runOnUiThread(() -> { - // بروزرسانی UI - Toast.makeText(MainActivity.this, - "Embedding ایجاد شد برای: " + employeeFullName, - Toast.LENGTH_SHORT).show(); - - // دریافت داده‌های جدید از API - refreshEmployeeList(); - }); - } - - @Override - protected void onEmbeddingDeleted(long employeeId, String timestamp) { - runOnUiThread(() -> { - // بروزرسانی UI - refreshEmployeeList(); - }); - } - - @Override - protected void onEmbeddingRefined(long employeeId, String timestamp) { - runOnUiThread(() -> { - // بروزرسانی UI - refreshEmployeeList(); - }); - } - }; - - signalRClient.connect(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - if (signalRClient != null) { - signalRClient.disconnect(); - } - } - - private void refreshEmployeeList() { - // دریافت لیست جدید کارمندان از API - } -} -``` - -#### Kotlin: -```kotlin -class LoginActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_login) - - val btnLogin = findViewById